鍊錶結構解析 linux原始碼

2021-05-24 05:47:40 字數 815 閱讀 5512

在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...