linux核心鍊錶講解

2021-08-04 13:40:30 字數 2799 閱讀 5398

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); \

pos = 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#includetypedef 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_node(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 **argv)

linux核心鍊錶

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

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中就產生了核心鍊錶,以後想要在鍊錶中插入資料或刪除資料時,只需要呼叫函式就可以了。鍊錶對比 鍊錶是一種資料結構,他通過指標將一系列的資料節點連線成一條資料鏈...