免费注册 查看新帖 |

Chinaunix

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

list_head链表的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-21 09:58 |只看该作者 |倒序浏览
list_head链表的结构是
struct list_head
{
   struct list_head *pre, *next;
}
实际元素的数据结构类似于:
struct entry
{
   struct list_head list;
   void *data
}
在遍历连表时,需要通过list_entry来获取实际元素的指针;这和平时接触的链表不大一样;这样作的原因据说是为了构造通用的连表。
但如果仅仅是为了通用,这样定义也可以做到:
struct list_head
{
   struct list_head *pre, *next;
   void * entry
}
在连表的成员里加一个void指针,指向实际元素。

这两种方式比较,选用前者的原因是什么呢

论坛徽章:
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-03-21 10:10 |只看该作者
好处就是挂链表的时候不必考虑对象是什么。
挂接对象随意

你的那种实现颠倒逻辑关系
如果一个数据结构里有10个表头,那用你的实现要先做10个链表,然后分别把entry初始化

比较下 哪种更方便呢?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2011-03-21 10:34 |只看该作者
回复 1# greatho1507
应该是为了实现通用的连接结构
而且头部单独定义,也可以做到结构清晰化。

你可以自己再次包装成你喜欢的方式。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2011-03-21 10:39 |只看该作者
list_head链表的结构是
struct list_head
{
   struct list_head *pre, *next;
}
实际元素的数据结构类 ...
greatho1507 发表于 2011-03-21 09:58
你的那个当链表为空的时候就不行了。
既然链表为空,就应该是prev指向next,然后next指向prev,但是又多了一个data字段的指针(那就不为空了),所以这样子说不过去。

论坛徽章:
0
5 [报告]
发表于 2011-03-21 11:02 |只看该作者
对于4楼:
如果用这种结构:
struct list_head
{
   struct list_head *pre, *next;
   void * entry
}
在初始化的时候也只是在函数里多加一个: entry=NULL;
对于2楼的回答:
无论是那种结构,一个数据结构有多个list_head的时候,不都应该要初始化多次吗?

论坛徽章:
0
6 [报告]
发表于 2011-03-21 11:09 |只看该作者
另外,用void *指针指向实际元素,也不可用考虑对象是什么。
可能因为初次接触kernel,而之前看过的双连表的实现大体都是类似于
struct list_head
{
   struct list_head *pre, *next;
   void * entry
}
当看到内核的List_head时候,有点不习惯。所以在想着采用这种实现方式的缘由。

论坛徽章:
0
7 [报告]
发表于 2011-03-21 11:22 |只看该作者
另外,用void *指针指向实际元素,也不可用考虑对象是什么。
可能因为初次接触kernel,而之前看过的双连表 ...
greatho1507 发表于 2011-03-21 11:09



    你这样是在实现链表结点,而不是头。

论坛徽章:
0
8 [报告]
发表于 2011-03-21 11:39 |只看该作者
虽然名字是连表头,但作用还是一个双向连表,一种组织实际元素关系的方式。通常把第一个连表节点当成连表头;何况双连表是循环连表,其实只有名义上的表头

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2011-03-21 13:34 |只看该作者
对于4楼:
如果用这种结构:
struct list_head
{
   struct list_head *pre, *next;
   void * entry
...
greatho1507 发表于 2011-03-21 11:02
NULL也是一个值。也不是空链表了。

论坛徽章:
0
10 [报告]
发表于 2011-03-22 09:06 |只看该作者
回复 9# L_kernel


    但仅仅是因为这样的考虑,而选择这种“奇怪”逻辑的连表吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP