linux優雅的鍊錶

2022-08-20 17:18:12 字數 2301 閱讀 1340

鍊錶是每乙個程式設計師必學的乙個資料結構。理解上並不是很難,但是它卻很常用。所以我們為了避免重複造輪子,所以乙個好的設計就顯得格外的重要了。如果在c++中我們可以很容易的想到模板程式設計。可是在純c的環境下就沒有什麼簡單了。

為了避免重複的工作,先把工作中重複的部分提取出來。比如說是迴圈雙向鍊錶。每乙個節點包含了前乙個元素指標和後乙個元素的指標。為了操作的便利,我們會使用到帶頭節點的方式。前後指標的是每一種迴圈雙向鍊錶節點要包括的資料結構,所以就可以想辦法把其抽離出來,這裡給出了linux下的list的實現的簡版。(如果你參與過window下的驅動開發,應該也會發現這種實現方式的list)

1 #include 2 #include 3

4using

namespace

std;56

struct

list_head;910

#define list_head_init(name)

1112

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

1314

#define init_list_head(ptr) do while (0)17

18//

計算結構體內部成員的偏移,(求取結構體中的成員的偏移是筆試中常見題型)

19#define offset_of(type , member) (size_t)(&((type *)0)->member)

2021

//計算當前結構體的首位址 prt為member的位址, type為結構體的型別,(這個也會成為筆試題)

22#define container_of(ptr , type , member) \

23( \

24 (type *)( (char *)ptr -offset_of(type , member)) \25)

2627

28#define list_entry(ptr , type , member) \

29container_of(ptr , type , member)

3031

//32

//#define list_first_entry(ptr , type , member) \

33//

list_entry((ptr)->next , type , member)

3435

//36

#define list_for_each(pos, head) \

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

38 pos = pos->next)

3940

static inline int list_empty(const

struct list_head *head)

4344

static inline void __list_add(struct list_head *newnode, struct list_head *prev , struct list_head *next)

4551

52static inline void list_add(struct list_head *newnode, struct list_head *head)

5356

57static inline void list_add_tail(struct list_head *newnode, struct list_head *head)

5861

62static inline void __list_del(struct list_head *prev , struct list_head *next)

6367

68static inline void list_del(struct list_head *node)

6972

7374 typedef struct

my_structmy_struct_t;

7879

intmain()

80108

109 p =hd.next;

110list_del(hd.next);

111 free((my_struct_t*)list_entry(p, my_struct, list));

112113 list_for_each(p, &hd)

116117

return0;

118 }

深入分析 linux 核心鍊錶

linux 核心鍊錶與普通鍊錶

1 在linux核心中經常能夠看到 struct list head 這樣的乙個結構體,這個就是核心中的乙個鍊錶,核心鍊錶 struct list head 這個結構體中只有兩個指向鍊錶結構體的指標,分為前向指標和後向指標,因為可以用來構建乙個雙向鍊錶,但是這個鍊錶的用法與我們普通的鍊錶的用法不一樣...

linux 鍊錶及相關鍊錶操作

1.鍊錶結構體 struct list head2.list entry define container of ptr,type,member container of ptr,type,member ptr為list head指標,type為包含list head結構體物件型別,member為鍊...

linux核心鍊錶

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