免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8971 | 回复: 5
打印 上一主题 下一主题

list_add_tail问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-08 20:03 |只看该作者 |倒序浏览
  1. static inline void __list_add(struct list_head *new,
  2.                               struct list_head *prev,
  3.                               struct list_head *next)
  4. {
  5.         next->prev = new;
  6.         new->next = next;
  7.         new->prev = prev;
  8.         prev->next = new;
  9. }

  10. static inline void list_add_tail(struct list_head *new, struct list_head *head)
  11. {
  12.         __list_add(new, head->prev, head);
  13. }
复制代码
将new, head->prev, head传入__list_add()函数后:
  1. head->prev=new;                1
  2. new->next=head;                2
  3. new->prev=head->prev;      3
  4. head->prev->next=new;      4
复制代码
第三句不就是相当于new->prev=new了么,这样new的前驱指向自己了?
第四句不就相当于new->next=new了么,这样new的后驱也指向了自己?

问题较初级,望指教,多谢。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2011-11-08 20:14 |只看该作者
链表是双向循环的
放在表头的前一个位置其实就是最后一个位置

论坛徽章:
0
3 [报告]
发表于 2011-11-08 20:22 |只看该作者
链表是双向循环的
放在表头的前一个位置其实就是最后一个位置
amarant 发表于 2011-11-08 20:14



    同样的方法带入list_add则可以说的通,但是带入到list_add_tail就看不明白了。

如果为空链表呢?刚开始构造的时候。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2011-11-08 20:31 |只看该作者
同样的方法带入list_add则可以说的通,但是带入到list_add_tail就看不明白了。

如果为空链表呢 ...
Artist 发表于 2011-11-08 20:22



    list_add  是把新节点放在head后面
    list_add_tail 把新节点放在head前面(其实就是从head开始正向遍历的最后一个元素)

如果head是空节点,那肯定就挂了

论坛徽章:
0
5 [报告]
发表于 2011-11-08 20:50 |只看该作者
本帖最后由 Artist 于 2011-11-08 20:56 编辑
list_add  是把新节点放在head后面
    list_add_tail 把新节点放在head前面(其实就是从head开 ...
amarant 发表于 2011-11-08 20:31



我的理解,list_add是将new节点放在head和head->next的中间;
而list_add_tail是将new节点放在head->next的后面,作为最后一个节点。

方法很简单,就是将参数带入到函数:
list_add(new, head, head->next):
{
    head->next->prev=new;        1
    new->next=head->next;        2
    new->prev=head;
    head->next=new;
}
如果链表是空的,则head->next,head->prev都指向自己,所以第1句等价为head->prev=new; 第2句等价为new->next=head; 这正好是首位循环的相连。

当同样的方法带入到list_add_tail就感觉不对了,望指点一二。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
6 [报告]
发表于 2011-11-08 22:56 |只看该作者
list_add_tail 是把new放在 head->prev 和 head 之间阿
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP