鍊錶是每乙個程式設計師必學的乙個資料結構。理解上並不是很難,但是它卻很常用。所以我們為了避免重複造輪子,所以乙個好的設計就顯得格外的重要了。如果在c++中我們可以很容易的想到模板程式設計。可是在純c的環境下就沒有什麼簡單了。
為了避免重複的工作,先把工作中重複的部分提取出來。比如說是迴圈雙向鍊錶。每乙個節點包含了前乙個元素指標和後乙個元素的指標。為了操作的便利,我們會使用到帶頭節點的方式。前後指標的是每一種迴圈雙向鍊錶節點要包括的資料結構,所以就可以想辦法把其抽離出來,這裡給出了linux下的list的實現的簡版。(如果你參與過window下的驅動開發,應該也會發現這種實現方式的list)
1 #include 2 #include 34using
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...