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 ...