红联Linux门户
Linux帮助

linux 的list.h 错误?

发布时间:2014-12-06 03:15:52来源:红联作者:airfeiair
link.h里的这几行代码老感觉哪里不对,大神帮忙看一下额
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
内联函数为了不占用额外的资源不就在调用的时候展开,
根本没有重新分配空间
上面一个自然木有问题,下面一个不就是替换成这样了么,

head->prev = new;
new->next = head;
new->prev = head->prev;
head->prev->next = new;


第三行这一行head的prev不是已经断了接到new了么,不成了自己连自己了??
文章评论

共有 3 条评论

  1. qianhng 于 2014-12-09 10:02:04发表:

    楼主理解错误了
    __list_add(new, head->prev, head);
    该函数是传址,其中的head->prev是一个指针存放于堆栈中,并不会随你head->prev=new而改变,
    改变的是head而不是堆栈.

    比如存在一个tail,list_add_tail实际上是__list_add(new,tail_prev,tail);
    替换成
    tail->prev = new;
    new->next = tail;
    new->prev = tail_prev;
    tail_prev->next = new;

  2. cnbingu 于 2014-12-07 09:02:58发表:

    不懂的路过

  3. linuxuser2014 于 2014-12-06 09:28:19发表:

    1# airfeiair
    这就是循环链表