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的节点
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的节点
相关文章推荐
- 双向链表添加节点和删除结点
- 数据结构:双向链表list的表头/尾添加数据、链表显示、链表清空
- 数据结构:双向链表list的表头/尾添加数据、链表显示、链表清空
- Java双向链表的创建结点,清空链表,添加结点,删除结点
- list 链表及list_add_tail 双向链表实现分析
- 深入浅出linux内核源代码之双向链表list_head(上)
- C#高阶与初心:(一)List.Add添加的到底是什么?
- linux内核源码“双向链表list_head”
- C语言实现链表之双向链表(六)删除头结点
- c链表结点的删除和添加
- LeetCode 19. Remove Nth Node From End of List--删除链表的倒数第n个结点
- 含有头结点双向循环链表
- 解决list.add() 方法会覆盖前面的已经添加好的参数
- 和菜鸟一起学linux之双向链表list head的简单实例
- 设以带头结点的双向循环链表表示的线性表L= (a1,a2,…,an),试写一时间复杂度O(n)的算法,将L改造为 (a1,a3,…,an,…,a4,a2)。
- QLinkedList和std::forward_list(都是双向链表,不支持operator[],好处可能是插入和删除都比较快)
- [leetcode] Delete Node in a Linked List 删除链表中的一个结点
- (链表) Add to List 2. Add Two Numbers
- 【C++/STL】list的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)
- 双向链表(不带头结点)