在linux核心**中,經常會使用到鍊錶結構,其中分為普通鍊錶和雜湊表。普通鍊錶在檔案list.h中,定義的格式如下:
struct list_head ;
其中比較難理解的地方有兩點:
1、如何通過在資料結構中新增list_head成員變數實現鍊錶;
2、如何通過list_head成員變數訪問宿主資料;
關於第二點,本文稍作解釋。
list_head成員可以放置在宿主的任意位置,不需要放置在第乙個變數的位置。當需要訪問宿主的結構時,首先通過使用list_head成員變數的位址減去相對於結構的偏移量,從而獲取結構的位址,進而可以訪問結構的其他成員。使用公式表示如下:
address(struct data)=address(list_head)-offset(list_head)
如下圖所示:
struct data
------------------_______
| length | |
| ... | 偏移量
| list_head |__|____
| ... |
| |
------------------
LinkedList原始碼解析之鍊錶結構
單鏈表與雙鏈表的結構圖 單向鍊錶 class node 雙向鍊錶 class node linkedlist採用的是雙向鍊錶 linkedlist的add 方法 public boolean add e e void linklast e e linkedlist的get 方法 public e g...
redis原始碼解析之鍊錶結構
typedef struct listnode listnode 雙端鍊錶節點包含2個指標域和1個資料域,注意資料的型別為void 因此其可以承載任意資料型別。typedef struct list list 雙端鍊錶中,使用函式指標來封裝與節點值相關的操作,在後面的使用中較頻繁,並維護乙個len作...
redis0 1原始碼解析之鍊錶
分析 之前先看看鍊錶的資料結構。新建乙個煉表頭結點 list listcreate void 釋放乙個鍊錶 void listrelease list list 釋放鍊錶記憶體 zfree list 3 插入乙個節點 支援頭插和尾插 給鍊錶新增乙個節點,頭插法 list listaddnodehea...