注意這個鍊錶只能在驅動程式中使用
定義struct list_head
#define list_head(name) \
struct list_head name = list_head_init(name)
static struct list_head list_head_init(head);
就初始化了乙個煉表頭為head的雙鏈表
或者使用list_head(head) ;一步到位
新增鍊錶:
static inline void list_add(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)
經過我的分析:list_add(new,head)是將new新增到head後面,應該叫插入head後面
如果要加入鏈尾,使用list_add_tail
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)
static inline void __list_del(struct list_head * prev, struct list_head * next)
刪除了entry這個鍊錶
鍊錶的移動:將list節點加到head後面
static inline void list_move(struct list_head *list, struct list_head *head)
static inline void __list_del_entry(struct list_head *entry)
static inline void __list_del(struct list_head * prev, struct list_head * next)
鍊錶的遍歷:
#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))
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
#define container_of(ptr, type, member) ()
container_of()實現了根據乙個已知結構體成員的指標和變數名得出宿主結構體的位址的功能
list_entry用於獲取struct list_head結構體指標所在結構體變數的首位址
list_first_entry用於獲取鍊錶中第乙個節點所在結構體的首位址
如圖:
linux核心鍊錶的使用
此模組已經在linux 2.6 執行成功.本文章僅僅通過例項演示如何使用linux 核心鍊錶 include include include include include module license gpl 實際資料結構 struct student 鍊錶的頭結點,無資料 struct list...
Linux 核心鍊錶使用舉例
鍊錶資料結構的定義很簡潔 struct list head list head結構包含兩個指向list head結構的指標prev和next,該核心鍊錶具備雙鏈表功能,通常它都組織成雙迴圈鍊錶,這裡的list head沒有資料域。在linux核心鍊錶中,不是在鍊錶結構中包含資料,而是在資料結構中包含...
linux核心鍊錶
鍊錶是一種常用的資料結構,它通過指標將一系列資料節點連線成一條資料鏈。相對於陣列,鍊錶具有更好的動態性,建立鍊錶時無需預先知道資料總量,可以隨機分配空間,可以高效地在鍊錶中的任意位置實時插入或刪除資料。鍊錶的開銷主要是訪問的順序性和組織鏈的空間損失。一 鍊錶結構 單鏈表結構如下 雙鏈表結構如圖 st...