出處:
核心中的定義:
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...