node1
node3
hlist数据结构有两个hlist_head和hlist_node
使用hash表是为了快速获取表中的数据,注重效率;哈希链表中,节点的插入操作都是插在链表头的位置
hlist结构
hlist_head只有一个域,即first -- 占用空间小
hlist_node有两个域,pprev是一个二级指针,指向前一个节点的next指针的地址 -- 由于hlist_head的first域指向的结点类型和hlist_node指向的下一个结点的结点类型相同,这样就解决了通用性
next = &node2 pprev = &head.first
next = NULL
first指针指向的是hlist_node1。first始终指向新插入的结点。
从而在表头插入的操作中可以通过一致的node->pprev访问和修改前结点的next(或first)指针
pprev = &node2.next

pprev是指向上一个节点的next的指针,next是指向hlist_node节点的指针,所以pprev是指向hlist_node指针的指针
添加节点
static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
{
struct hlist_node*first=h->first;//保存原首节点?
n->next=first;//新节点指向原首节点?
if(first)
first->pprev=&n->next;//如果first存在,更新它的pprev指向新节点的next
h->first = n;
n->pprev = &h->first;
}
h指向的是哈希表的特定的一个桶,first指向hlist的第一个数据节点



