Linux双向链表操作实现教程,linux教程


Linux双向链表操作实现教程

代码位于include/linux/list.h,链表初始化:

static inline void INIT_LIST_HEAD(struct list_head *list)
{
    list->next = list;
    list->prev = list;
}

初始化后,链表状态图,框图左侧为prev指针,右侧为next指针:

\

利用list_add_tail函数首次插入一个节点 ,代码:

static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
    __list_add(new, head->prev, head);
}

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;
}

首个节点new1插入之后的链表框图:

\

继续调用list_add_tail函数插入第二个节点new2的框图如下:

\

双向链表循环代码:

#define list_for_each(pos, head) \
    for (pos = (head)->next; pos != (head); pos = pos->next)

循环处理的顺序与list_add_tail的顺序相同,首先由header的next指针开始,也就是节点new1,之后是节点new2,一直循环到节点header为止。

相关内容