Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40187
  • 博文数量: 16
  • 博客积分: 365
  • 博客等级: 一等列兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-08 13:58
文章分类
文章存档

2014年(1)

2013年(1)

2012年(14)

我的朋友

分类: LINUX

2012-05-08 19:19:30

Linux 链表设计者(因为 list.h 没有署名,所以很可能就是 Linus Torvalds)认为双头(next、prev)的双链表对于 HASH 表来说 "过于浪费",因而另行设计了一套用于 HASH 表应用的 hlist 数据结构--单指针表头双循环链表,从上图可以看出, hlist 的表头仅有一个指向首节点的指针,而没有指向尾节点的指针,这样在可能是海量的 HASH 表中存储的表头就能减少一半的空间消耗。

因为表头和节点的数据结构不同,插入操作如果发生在表头和首节点之间,以往的方法就行不通了:表头的 first 指针必须修改指向新插入的节点,却不能使用类似 list_add() 这样统一的描述。为此,hlist 节点的pprev 不再是指向前一个节点的指针,而是指向前一个节点(可能是表头)中的 next(对于表头则是 first)指针(struct list_head **pprev),从而在表头插入的操作可以通过一致的 "*(node->;pprev)" 访问和修改前驱节点的 next(或 first)指针。 

struct hlist_head{

struct hlist_node *first;

}

struct hlist_node{

struct hlist_node *next,**pprev;

}
阅读(647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~