Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1479541
  • 博文数量: 217
  • 博客积分: 4362
  • 博客等级: 上校
  • 技术积分: 4179
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 09:31
文章分类

全部博文(217)

文章存档

2017年(1)

2015年(2)

2014年(2)

2013年(6)

2012年(42)

2011年(119)

2010年(28)

2009年(17)

分类: LINUX

2011-09-04 21:55:54

以下是写给陈老师的一份邮件:


陈老师:
之前我仔细研究了list.h头文件,网上关于list链表描述很多,但是hlist链表的描述比较少。我自己把hlilst好好的也研究了一番,但是不知道自己的理解是不是正确的,上周一晚上讲座的时候,有一个细节问题:发现老师的《深入理解linux内核》(第3版)中的第93页中关于hlist和我讲的hlist有些差异。
老师书中93页中间有这么一句“第一个元素的pprev字段和最后一个元素的next字段都置为NULL”。书中的意思就是说,hlist的下一个节点(也就是hlist的第一个元素)的pprev指向的是空。
按照这种理解,当只有一个元素的时候,就是附件hlist1当中图片所描述的那样。


但是我的研究结果是附件二当中的那样。

我做了一个测试:
为了验证我的想法,可以开始假设这个hlist链表只有一个头结点head(struct hlist_head类型),经过初始化之后,head->first是NULL,然后我们可以申请一个新的struct hlist_node类型的节点n,然后调用
list_add_head(n, head),进行头插,插入之后的结果就是附件当中hlist2.png的结果。
具体的实现代码可以这样来设计:

HLIST_HEAD(head);
struct hlist_node n;
INIT_HLIST_NODE(&n);
hlist_add_head(n, head);

其中涉及到的宏定义和函数:
#define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
static inline void INIT_HLIST_NODE(struct hlist_node *h)
{
   h->next = NULL;
   h->pprev = NULL;
}
  1. static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
  2. {
  3.     struct hlist_node *first = h->first;
  4.     n->next = first;
  5.     if (first)
  6.         first->pprev = &n->next;
  7.     h->first = n;
  8.     n->pprev = &h->first;
  9. }
 

我的结论:整个hlist链表的组织方式,我认为,第一个元素的pprev指向的不是NULL,而是头结点的first的地址;最后一个元素的next才指向的是NULL。
完整的组织方式是附件3当中的hlist.jpg.

不知道我这样的理解哪里出现了问题?
请大家帮忙分析一下~~~
阅读(4146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~