include/linux/types.h
// 列表头
struct hlist_head {
struct hlist_node *first; // 指向第一个节点
};
// 列表节点
struct hlist_node {
/* next 指向下一个节点
* pprev指向上一个节点的next指针
*/
struct hlist_node *next, **pprev;
};
用来表示哈希表中的散列表,列表的结构如下:
其中pprev指向上一个节点的next指针,如果是第一个节点,指向表头的first指针。这样设计使得表头只有一个指针,对于大的哈希表可以减少空间。
/* next must be != NULL
* 插入到next之前
*/
static inline void hlist_add_before(struct hlist_node *n,
struct hlist_node *next)
{
/* 假设节点为 b next
* n 插入到当中,成为b n next
*/
n->pprev = next->pprev; // n的上一个节点为next的上一个节点(b)
n->next = next; // n的下一个节点为next
next->pprev = &n->next; // next的上一个节点为n(pprev指向新节点的next)
*(n->pprev) = n; // b的下一个节点n
}
static inline void __hlist_del(struct hlist_node *n)
{
/* 假设节点为 b n a
*/
struct hlist_node *next = n->next; // a节点
struct hlist_node **pprev = n->pprev; // b节点
*pprev = next; // b节点的下一个节点成为a
if (next)
next->pprev = pprev; // a节点的上一个节点成为b
}
static inline void hlist_del(struct hlist_node *n)
{
__hlist_del(n);
n->next = LIST_POISON1; // 指向非法值
n->pprev = LIST_POISON2; // 指向非法值
}