迴圈雙向鍊錶

2022-08-24 15:45:08 字數 1200 閱讀 8597

linux核心鍊錶:帶頭結點的雙向迴圈鍊錶,頭結點屬於鍊錶成員。(頭結點的next指向首節點,頭結點的pre指向尾節點。頭結點同時被首節點的pre和尾節點的next所指向)

節點定義:

struct

list_head

;內嵌節點到自定義結構體:

struct

node

;struct node

;定義鍊錶及初始化

struct

node list;

struct list_head* list = (struct list_head*)list;

init_list_head(list);

插入操作

list_add(

new,head) //

插入頭部

list_add_tail(

new,head) //

插入尾部

刪除操作

list_del(*entry)

遍歷操作

list_for_each(pos,head)

//正向遍歷

list_for_each_pre(pos,head)

//逆向遍歷

核心兩個巨集:

#ifndef offsetof

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

#endif

#ifndef contain_of

#define contain_of(ptr,type,member) \ (),花括號裡最後乙個語句的值代表整個花括號表示式的值

const

typeof(((type*)0)->member)* _mptr = ptr; \ //

檢查ptr指標指向變數的型別是否是結構體type中成員member的型別。取結構體中member的型別來重新解釋ptr指標。

(type*)((char*)_mptr - offsetof(type,member)); \ //

typeof是gunc編譯器的關鍵字,得到變數的型別。只在編譯期間有效

})#endif

雙向鍊錶和雙向迴圈鍊錶

和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...

迴圈鍊錶,雙向鍊錶

迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...

鍊錶 雙向迴圈鍊錶

雙向迴圈鍊錶與單鏈表一樣,都是邏輯連續 物理不連續的儲存方式,但它的效果要遠遠優於單鏈表,其結構如下 雙向迴圈鍊錶首先要有乙個頭節點,頭節點中不存放資料,真正的資料從頭節點的下乙個節點開始存放 然後每乙個節點都有兩個指標,分別指向前乙個節點和後乙個節點 最後頭尾相連,就成了雙向迴圈鍊錶。includ...