以下是写给陈老师的一份邮件:
陈老师:
之前我仔细研究了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;
}
- static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
- {
- struct hlist_node *first = h->first;
- n->next = first;
- if (first)
- first->pprev = &n->next;
- h->first = n;
- n->pprev = &h->first;
- }
我的结论:整个hlist链表的组织方式,我认为,第一个元素的pprev指向的不是NULL,而是头结点的first的地址;最后一个元素的next才指向的是NULL。
完整的组织方式是附件3当中的hlist.jpg.
不知道我这样的理解哪里出现了问题?
请大家帮忙分析一下~~~
相关热门文章
给主人留下些什么吧!~~
评论热议