Linux中的核心鍊錶例項詳解

2022-10-06 20:00:25 字數 2802 閱讀 4581

linux中的核心鍊錶例項詳解

鍊錶中一般都要進行初始化、插入、刪除、顯示、釋放鍊錶,尋找節點這幾個操作,下面我對這幾個操作進行簡單的介紹,因為我的能力不足,可能有些東西理解的不夠深入,造成一定的錯誤,請各位博友指出。

a、linux核心鍊錶中的幾個主要函式(下面是核心中的原始碼拿出來給大家分析一下)

1)初始化:

#define init_list_head(ptr) do while (0) // ptr為struct list_head,其中包括兩個指標next和prev,這裡已經可以看出核心鍊錶是雙向迴圈鍊錶

2)尾部插入:

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

//尾部插入,傳入的引數是新節點中的兩個指標和頭結點中的兩個指標

3)頭部插入函式

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

//頭插入函式,傳入的引數是新節點中的兩個指標和頭結點中的兩個指標

4)刪除節點函式

static inline void list_del(struct list_head *entry) //傳入要刪除節點中的指標域

5)顯示函式(如果要列印出煉表中的資訊的話要自己寫成列印的函式,比如printf,因為這個其實是乙個遍歷的函式,沒有顯示的功能)

#define list_for_each_entry(pos, head, member) \

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

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

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

/* 這個函式用於遍歷鍊錶

pos為節點指標,

head是頭結點中的兩個指標的位址

member為各節點中的指標域

*/6)刪除鍊錶

#define list_for_each_safe(pos, n, head) \

for (pos = (head)->next, n = pos->next; pos != (head); \

pos =程式設計客棧 n, n = pos->next)

//這裡面的pos和n都是list_head指標,n指標是用於在刪除時不讓鍊錶斷鏈

7)尋找節點(這也是用的核心中的遍歷函式)

#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))

b.下面來段**給大家看看具體的運用方法

#include"kernel.h"

#include

#include

#include

typedef struct list_node

*node,node1;

node init_head(node head)//初始化空鍊錶

init_list_head(&(head->list));//#define init_list_head(ptr) do while (0)//呼叫核心中的初始化函式,傳入的引數是

//節點的中兩個指標,即struct list_head結構體中的兩個指標

return head;

}node insert_tail(node head,int data)//尾部插入函式

new->data = data;

list_add_tail(&(new->list),&(head->list));//呼叫核心中的從尾部插入的函式,傳入的引數為新節點中的兩個指標

//和頭結點中的兩個指標

return 0;}

head_insert_node(node head,int data)//頭插入函式

new->data = data;

list_add(&(new->list),&(head->list));//呼叫核心中從頭插入的函式,傳入的引數為新節點的兩個指標和頭結點的兩個指標

return 0;

}node search_nodfoajuree(node head,int data)//尋找節點函式

}puts("not found the data!");

return null;

ok:return 程式設計客棧p;

}int show_node(node tmp)

printf("the data is %d\n",tmp->data);

return 0;

}int delete_node(node head,int data)}f:

list_del(&(p->list));

free(p);

return 0;

}int show_list(node head)

return 0;

}int delete_list(node head)//刪除鍊錶函式

list_del(&(head->list));

free(head);

return 0;

}int main(int argc,char **ar**)

linux核心雙向迴圈鍊錶例項

ifndef list h define list h 核心裡的雙向迴圈鍊錶 是乙個只有指標域而沒有資料域的結構 struct list define list head init name define list head name struct list name list head init ...

Linux核心通用鍊錶詳解

linux核心中充斥著大量的資料結構,這些資料結構很多都是使用結構體來表示 如cdev結構體用於描述乙個字元裝置,再如task struct結構體,是我們所說的程序控制塊pcb,用於描述乙個程序的所有資訊。追尋核心原始碼我們會發現很多都是表示裝置的結構體中都有list head這樣的字段,沒錯這就是...

Linux核心鍊錶細節及應用例項

核心鍊錶是雙向迴圈鍊錶 核心鍊錶的實質是通過操作小結構體來實現插入 遍歷 刪除等功能 對於 list for each entry iterate over list of given type pos the type to use as a loop counter.head the head ...