hlist雜湊鍊錶

2021-04-16 02:25:52 字數 1937 閱讀 2380

原文出處:http://blog.chinaunix.net/u/12592/showart.php?id=451619

王耀([email protected])

hlist雜湊鍊錶是核心中常用的乙個資料結構,由於它不同於普通的鍊錶,所以這裡對hlist雜湊鍊錶進行一下分析,希望對大家有所幫助。

在include/linux/list.h中有list鍊錶與hlist雜湊鍊錶結構的定義,下面都列出它們的定義,可以對比一下:

struct list_head ;

struct hlist_head ;

struct hlist_node ;

雙頭(next,prev)的雙鏈表對於hash表來說「過於浪費」,因而另行設計了一套hash表專用的hlist資料結構——單指標表頭雙迴圈 鍊錶,hlist的表頭僅有乙個指向首節點的指標,而沒有指向尾節點的指標,這樣在可能是海量的hash表中儲存的表頭就能減少一半的空間消耗。

pprev因為hlist不是乙個完整的迴圈鍊錶而不得不使用。在list中,表頭和節點是同乙個資料結構,直接用prev沒問題;在hlist中,表頭 沒有prev,也沒有next,只有乙個first。為了能統一地修改表頭的first指標,即表頭的first指標必須修改指向新插入的節點, hlist就設計了pprev。hlist節點的pprev不再是指向前乙個節點的指標,而是指向前乙個節點(可能是表頭)中的next(對於表頭則是 first)指標(struct list_head **pprev),從而在表頭插入的操作可以通過一致的「*(node->pprev)」訪問和修改前節點的next(或first)指標。

注:pprev是指向前乙個節點中的next指標,next是指向hlist_node的指標,所以pprev是乙個指向hlist_node的指標的指標。

注意:pprev可以理解成向list的prev一樣,是乙個指向hlist_node的指標,又由於hlist_node的第乙個元素next是乙個指向 hlist_node的指標,pprev也是乙個指向next的指標,即pprev是乙個指向hlist_node的指標的指標。

struct hlist_node prev;

struct hlist_node *pprev = (struct hlist_node *) prev = (struct hlist_node *) (struct hlist_node * next) = struct hlist_node ** next;

下面是hlist中常用的幾個巨集:

#define hlist_head_init

#define hlist_head(name) struct hlist_head name =

#define init_hlist_head(ptr) ((ptr)->first = null)

#define init_hlist_node(ptr) ((ptr)->next = null, (ptr)->pprev = null)

下面只列出hlist_add_before操作函式,其他hlist鍊錶操作函式操作方法類似。這個函式中的引數next不能為空。它在next前面加入了n節點。函式的實現與list中對應函式類似。

static inline void __hlist_del(struct hlist_node *n)

static inline void hlist_add_before(struct hlist_node *n,struct hlist_node *next)

#define hlist_entry(ptr, type, member) container_of(ptr,type,member)

#define hlist_for_each(pos, head) /

for (pos = (head)->first; pos && (); /

pos = pos->next) 

hlist 雜湊鍊錶

linux鍊錶設計者 因為 list.h 沒有署名,所以很可能就是 linus torvalds 認為雙頭 next prev 的雙鏈表對於 hash 表來說 過於浪費 因而另行設計了一套用於 hash 表應用的hlist資料結構 單指標表頭雙迴圈鍊錶,從上圖可以看出,hlist的表頭僅有乙個指向首...

雜湊鍊錶hlist

zyd cu ydzhang.blog.chinaunix.net 鍊錶 list 和雜湊表 hlist 是核心常用到的兩個工具,負責組織核心中很多的資料結構,如在程序管理中用於組織程序,檔案系統中的inode節點鍊錶,dentry鍊錶,vfsmount鍊錶等等。鍊錶使用struct list he...

雜湊鍊錶hlist解惑

鍊錶 list 和雜湊表 hlist 是核心常用到的兩個工具,負責組織核心中很多的資料結構,如在程序管理中用於組織程序,檔案系統中的inode節點鍊錶,dentry鍊錶,vfsmount鍊錶等等。鍊錶使用struct list head內嵌結構來將其寄生的結構組織成雙向迴圈鍊錶,並且表頭跟普通節點的...