Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151530
  • 博文数量: 27
  • 博客积分: 531
  • 博客等级: 一等列兵
  • 技术积分: 332
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-25 18:31
文章分类

全部博文(27)

文章存档

2015年(4)

2014年(3)

2013年(6)

2012年(14)

我的朋友

分类: LINUX

2013-01-13 17:19:10

    这几天有一篇文章比较惹眼,

    刚开始看的时候还觉得挺庆幸,自认为学过汇编,写过一些汇编代码,对指针这东西还是比较理解的。但是
在试图跟踪理解这位大神的代码时发现还是没有理解,或者说知道双指针,但是没想到有这么精妙的用法。

    先来看看代码:

点击(此处)折叠或打开

  1. void remove_if(node ** head, remove_fn rm)
  2. {
  3.         for (node** curr = head; *curr; )
  4.         {
  5.             node * entry = *curr;
  6.             if (rm(entry))
  7.             {
  8.                 *curr = entry->next;
  9.                 free(entry);
  10.             }
  11.             else
  12.                 curr = &entry->next;
  13.         } 
  14. }

其中,rm是一个指向函数的指针,判断node是否需要删除,定义见原文。刚开始看的时候觉得这短代码使用
双指针实在是多余,只是少了返回值的使用。而且代码好像会把链表删断。但是仔细琢磨之后发现其中精妙,
不得不佩服大神就是大神。

开始觉得,entry = *curr; 然后如果要删除, *curr = entry->next; 这样curr移动位置了,但是前面的node
被遗弃了。最后,恍然大悟,原来 *curr 其实就是虽未的pre->next,进入for的时候是,每次删除或者不删除
前进的时候都是将下一个next赋值给 *curr, 这也就是else中使用 &entry->next 赋值给 entry 的原因。

这段代码中使用rm函数控制删除逻辑的方式也是值得学习的。毕竟是一种c的多态。

深感应该多看看大神的代码,好好体会体会!
阅读(2420) | 评论(0) | 转发(0) |
0

上一篇:LAMP搭建

下一篇:java技术的区别

给主人留下些什么吧!~~