这几天有一篇文章比较惹眼,
刚开始看的时候还觉得挺庆幸,自认为学过汇编,写过一些汇编代码,对指针这东西还是比较理解的。但是
在试图跟踪理解这位大神的代码时发现还是没有理解,或者说知道双指针,但是没想到有这么精妙的用法。
先来看看代码:
- void remove_if(node ** head, remove_fn rm)
- {
- for (node** curr = head; *curr; )
- {
- node * entry = *curr;
- if (rm(entry))
- {
- *curr = entry->next;
- free(entry);
- }
- else
- curr = &entry->next;
- }
- }
其中,rm是一个指向函数的指针,判断node是否需要删除,定义见原文。刚开始看的时候觉得这短代码使用
双指针实在是多余,只是少了返回值的使用。而且代码好像会把链表删断。但是仔细琢磨之后发现其中精妙,
不得不佩服大神就是大神。
开始觉得,entry = *curr; 然后如果要删除, *curr = entry->next; 这样curr移动位置了,但是前面的node
被遗弃了。最后,恍然大悟,原来 *curr 其实就是虽未的pre->next,进入for的时候是,每次删除或者不删除
前进的时候都是将下一个next赋值给 *curr, 这也就是else中使用 &entry->next 赋值给 entry 的原因。
这段代码中使用rm函数控制删除逻辑的方式也是值得学习的。毕竟是一种c的多态。
深感应该多看看大神的代码,好好体会体会!
阅读(2420) | 评论(0) | 转发(0) |