鍊錶 list 的巨集定義實現

2021-05-21 12:36:19 字數 847 閱讀 4849

-- 看**是一種享受

最近在看dhcp的原始碼,一些好的記錄下來。平時寫c,用到鍊錶就是copy資料結構上的**,簡單粗暴,今天換種方式,看下巨集定義實現的鍊錶,好處自然是**少、效率高。

首先下面鍊錶巨集定義的實現,摘自wide-dhcpv6-20080615原始碼包

比較難理解的可能是list_entry中的成員le_prev,它不是平時雙向鍊錶中的前向指標(指向前乙個元素),而是前向前乙個元素的le_next成員的指標(可能比較繞口,下面看圖更清楚)。

上圖顯示了煉表頭插入兩個元素: elem-1和elem-2後指標的指向,注意le_prev指向的是指標的位址,而不是元素的位址。

下面逐一分析:

1. 宣告鍊錶的一項entry結構體, 包含兩個成員:計數值(鍊錶的資料部分)counter和指向前後的指標link

2. 宣告煉表頭sn_head

可能不大好理解,將巨集定義展開就很清晰了,其實就是定義了煉表頭

3. 鍊錶的初始化

4. 再就是使用了,包括了插入、刪除、列舉,就不一一枚舉了

插入做的就是改變前後指標,假如將元素elem2插入到elem1後,elem3前,則將elem1的le_next指標指向elem2,elem2的le_next指標指向elem3;將elem2的le_prev指標指向elem1的成員le_next,將elem3的le_prev指標指向elem2的成員le_next

刪除做的也是改變前後指標,假如從elem1和elem3間刪除elem2,則將elem1的le_next指標指向elem3,elem3的le_prev指向elem1的le_next成員

列舉就是順著煉表頭向下,僅使用le_next成員即可

java自定義List鍊錶

第一步 定義乙個list介面,規定一些基本操作 package my.stack public class node public node t data public node t data,nodenext public void setdata t data public t getdata ...

鍊錶(list)的實現(c語言)

鍊錶是一種基本的資料結構,今天練習了一下,所以將 貼在下面,測試通過,還可以優化,我會過段時間就會增加一部分或者優化一部分直達 無法優化為止,我的所有資料結構和演算法都會用這樣的方式在部落格上面更新。include include struct node typedef struct node no...

C 實現雙向鍊錶(List)

list是c 容器類中的 順序儲存結構 所包含的一種結構。list是非連續儲存結構,具有雙鏈表結構,支援前向 後向遍歷,且支援高效的隨機刪除 插入。實現 如下 list.h pragma once include include include using namespace std typedef...