内核list (双向循环链表)
类型:
struct list_head {
struct list_head *next, *prev;
};
链表的初始化(两种方式):
1. LIST_HEAD 定义一个头,并且初始化为循环链表
2. INIT_LIST_HEAD(内联函数)初始化为循环链表
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}
添加元素(两种方式):
1. 头插(list_add) :__list_add(new, head, head->next);
2. 尾插(list_add_tail) :__list_add(new, head->prev, head);
两中方式本质相同往两个元素中间插入元素。
(双向循环链表特点的体现)
删除元素(一种方式):
1. (list_del): __list_del(entry->prev, entry->next) 让两边元素相互指向
让被删除元素指向LIST_POISON