linux 核心鍊錶與普通鍊錶

2021-09-21 06:10:26 字數 1573 閱讀 7177

1、在linux核心中經常能夠看到 struct list_head 這樣的乙個結構體,這個就是核心中的乙個鍊錶,核心鍊錶

struct list_head ;

這個結構體中只有兩個指向鍊錶結構體的指標,分為前向指標和後向指標,因為可以用來構建乙個雙向鍊錶,但是這個鍊錶的用法與我們普通的鍊錶的用法不一樣,

我們的一般的鍊錶結構體中都會包含兩部分:乙個是指標(前向指標和後向指標)部分,還有就是有效資料部分。將我們鍊錶需要存放的資料放在結構體中的有效資料

(1)但是核心鍊錶的結構體中只有兩個指標,並沒有有效資料區,所以核心鍊錶的用法和我們的普通鍊錶的用法是不一樣的,我們使用核心鍊錶的方法就是:

自己建立乙個結構體去包含這個核心鍊錶,將整個結構體作為乙個鍊錶的節點,然後使用內建的鍊錶的前向指標指向下乙個結構體中內建的鍊錶,使用內建的鍊錶的

後向指標指向上乙個結構體中內建的鍊錶。

例如:struct a

#define list_head(name)  struct list_head name = list_head_init(name)

static inline void init_list_head(struct list_head *list)

由上面可以知道,初始化就是將list_head中的兩個指標都指向自己本身。初始化乙個核心鍊錶的方法:

(1.1) 定義乙個核心鍊錶並進行初始化可以直接呼叫巨集: list_head(list);      展開之後:   struct list_head list = 

(1.2) 也可以定義和初始化分開, struct list_head list;    init_list_head(&list);

(2)核心鍊錶的常用函式

(2.1) list_add(struct list_head *new, struct list_head *head);         將節點插入到鍊錶頭部

list_add_tail(struct list_head *new, struct list_head *head);   將節點插入到鍊錶尾部

(2.2) list_del(struct list_head *entry);    刪除乙個節點,並將他的指標清除0

list_del_init(struct list_head *entry);   刪除乙個節點,並將他的指標再次指向自己本身

(2.3) list_replace(struct list_head *old, struct list_head *new);   替換鍊錶中的某個節點, old需要被替換的節點, new新的節點

list_replace_init(struct list_head *old, struct list_head *new);   和上面的區別在於,把替換之後的老的節點進行初始化

(2.4) int list_is_last(const struct list_head *list, const struct list_head *head);  測試乙個節點是否為煉表頭節點,list是要測試的節點,head是乙個煉表頭

int list_empty(const struct list_head *head);   測試鍊錶是否為空

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