list_add_tail 添加双向链表结点讲解

我是在看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的节点







你可能感兴趣的:(linux,list,struct,input,insert)