原文出處:http://blog.chinaunix.net/u/12592/showart.php?id=451619
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內嵌結構來將其寄生的結構組織成雙向迴圈鍊錶,並且表頭跟普通節點的...