linux核心鍊錶

2021-09-25 20:04:30 字數 2947 閱讀 8988

鍊錶是一種常用的資料結構,它通過指標將一系列資料節點連線成一條資料鏈。相對於陣列,鍊錶具有更好的動態性,建立鍊錶時無需預先知道資料總量,可以隨機分配空間,可以高效地在鍊錶中的任意位置實時插入或刪除資料。鍊錶的開銷主要是訪問的順序性和組織鏈的空間損失。

一、鍊錶結構

單鏈表結構如下:



雙鏈表結構如圖:

struct list_head ;

二、鍊錶初始化

#define list_head_init(name) 

#define list_head(name) \

struct list_head name = list_head_init(name)

static inline void init_list_head(struct list_head *list)

初始化鍊錶,將next、prev指標都初始化為指向自己;

三、判斷鍊錶是否為null

linux用頭指標的next是否指向自己來判斷鍊錶是否為空:

/**

* list_empty - tests whether a list is empty

* @head: the list to test.

*/static inline int list_empty(const struct list_head *head)

四、插入鍊錶

對鍊錶的插入操作有兩種:在表頭插入和在表尾插入。linux為此提供了兩個介面:

/**

* list_add - add a new entry

* @new: new entry to be added

* @head: list head to add it after

*

* insert a new entry after the specified head.

* this is good for implementing stacks.

*/static inline void list_add(struct list_head *new, struct list_head *head)

/** * insert a new entry before the specified head.

*/static inline void list_add_tail(struct list_head *new, struct list_head *head)

呼叫函式:

static inline void __list_add(struct list_head *new,

struct list_head *prev,

struct list_head *next)

五、刪除節點

static inline void list_del(struct list_head *entry)
六、合併鍊錶

/**

* list_splice - join two lists, this is designed for stacks

* @list: the new list to add.

* @head: the place to add it in the first list.

*/static inline void list_splice(const struct list_head *list,

struct list_head *head)

七、移動鍊錶

將list節點移動到鍊錶head的頭部;

static inline void list_move(struct list_head *list, struct list_head *head)

將list節點移動到鍊錶head的尾部;

static inline void list_move_tail(struct list_head *list,

struct list_head *head)

八、提取節點

#define list_entry(ptr, type, member) \

container_of(ptr, type, member)

container_of將在下一blog講解;

九、掃瞄鍊錶(遍歷)

/**

* list_for_each_entry - iterate over list of given type

* @pos: the type * to use as a loop cursor.

* @head: the head for your list.

* @member: the name of the list_struct within the struct.

*/#define list_for_each_entry(pos, head, member) \

for (pos = list_entry((head)->next, typeof(*pos), member); \

&pos->member != (head); \

pos = list_entry(pos->member.next, typeof(*pos), member))

遍歷head指向的鍊錶,掃瞄的物件是鍊錶中的元素,即member所在的pos對應的結構體;pos表示正在掃瞄的物件。

後續會利用函式來一一說明上述函式如何使用。

鏈結位址

linux核心鍊錶

include include struct list head struct mylist void list add struct list head new,struct list head prev,struct list head next void list add tail struc...

Linux核心鍊錶

核心鍊錶 核心鍊錶即,我麼在乙個鍊錶中插入或刪除乙個資料,都需要自己編寫 相當的麻煩,怎麼解決這個問題呢,為了更加方便的解決這個問題,linux中就產生了核心鍊錶,以後想要在鍊錶中插入資料或刪除資料時,只需要呼叫函式就可以了。鍊錶對比 鍊錶是一種資料結構,他通過指標將一系列的資料節點連線成一條資料鏈...

Linux核心鍊錶

1.在linux核心中使用了大量的鍊錶結構來組織資料,鍊錶結構的定義為 struct list head list head結構包含兩個只想list head結構的指標prev和next,由此可見,核心的鍊錶具備雙鏈表的功能。實際上,通常他都組織成雙向迴圈鍊錶。2.linux核心中提供的鍊錶操作主要...