您的位置:首页 > 大数据 > 人工智能

list_add_tail 添加双向链表结点讲解

2012-05-21 10:36 459 查看
我是在看linux 的input subsystem 的时候,用到的这个函数,当时我对链表还不怎么清楚

struct list_head {

struct list_head *next, *prev;

};

list_add_tail(&dev->node, &input_dev_list);

/**

* list_add_tail - add a new entry

* @new: new entry to be added

* @head: list head to add it before

*

* Insert a new entry before the specified head.

* This is useful for implementing queues.

*/

static __inline__ void list_add_tail(struct list_head *_new, struct list_head *head)

{

__list_add(_new, head->prev, head);

}

/*

* Insert a new entry between two known consecutive entries.

*

* This is only for internal list manipulation where we know

* the prev/next entries already!

*/

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;

}

其实这个函数完成的功能就是添加一个新的结点在head的左边,我接下来,详解讲解添加的过程

开始的时候,我们只知道有一个一个头节点,struct list_head *head,然后将next->prev = _new;

_new->next = next;这就是将new节点添加到head 节点的左边,那么接 _new->prev = prev;

prev->next = _new这两个是什么意思呢??/

因为开始head->pre->next是指向head的,因为现在添加了一个新的节点了,而且是在左边添加的,所以现在就需要将head->pre->next指向新的节点,而将新的节点的pre,也就是new->pre指向以前指向head的节点
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: