核心hlist鍊錶

2021-06-03 10:03:15 字數 1172 閱讀 9788

出處:

核心中的定義:

struct hlist_head ;

struct hlist_node ;

這個資料結構與一般的hash-list資料結構定義有以下的區別:

1) 首先,hash的頭節點僅存放乙個指標,也就是first指標,指向的是list的頭結點,沒有tail指標也就是指向list尾節點的指標,這樣的考慮是為了節省空間——尤其在hash bucket很大的情況下可以節省一半的指標空間.

2) list的節點有兩個指標,但是需要注意的是pprev是指標的指標,它指向的是前乙個節點的next指標;其中首元素的pprev指向煉表頭的fist欄位,末元素的next為null. (見下圖).

現在疑問來了:為什麼pprev不是prev也就是乙個指標,用於簡單的指向list的前乙個指標呢?這樣即使對於first而言,它可以將prev指標指向list的尾結點.

主要是基於以下幾個考慮:

1) hash-list中的list一般元素不多(如果太多了一般是設計出現了問題),即使遍歷也不需要太大的代價,同時需要得到尾結點的需求也不多.

2) 如果對於一般節點而言,prev指向的是前乙個指標,而對於first也就是hash的第乙個元素而言prev指向的是list的尾結點,那麼在刪除乙個元素的時候還需要判斷該節點是不是first節點進行處理.而在hlist提供的刪除節點的api中,並沒有帶上hlist_head這個引數,因此做這個判斷存在難度.

3) 以上兩點說明了為什麼不使用prev,現在來說明為什麼需要的是pprev,也就是乙個指向指標的指標來儲存前乙個節點的next指標--因為這樣做即使在刪除的節點是first節點時也可以通過*pprev = next;直接修改指標的指向.來看刪除乙個節點和修改list頭結點的兩個api:

static

inline

void

hlist_add_head(

struct

hlist_node

*n,

struct

hlist_head *h)

static

inline

void

__hlist_del(

struct

hlist_node *n)

hlist 雜湊鍊錶

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

hlist雜湊鍊錶

原文出處 http blog.chinaunix.net u 12592 showart.php?id 451619 王耀 wangyao cs.hit.edu.cn hlist雜湊鍊錶是核心中常用的乙個資料結構,由於它不同於普通的鍊錶,所以這裡對hlist雜湊鍊錶進行一下分析,希望對大家有所幫助。...

雜湊鍊錶hlist

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