Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1742160
  • 博文数量: 782
  • 博客积分: 2455
  • 博客等级: 大尉
  • 技术积分: 4140
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-06 21:37
个人简介

Linux ,c/c++, web,前端,php,js

文章分类

全部博文(782)

文章存档

2015年(8)

2014年(28)

2013年(110)

2012年(307)

2011年(329)

分类:

2011-09-26 00:03:20

 

linux 内核中的hlist_head和hlist_node结构被用于hash表,定义如下:

  1. struct hlist_head {
  2.    struct hlist_node *first;
  3. };
  4. struct hlist_node {
  5.    struct hlist_node *next, **pprev;
  6. };


hlist_node的pprev域开始没看明白为什么是hlist_node的二级指针,但看到代码中对它的使用是让它指向前一个节点的next域(对于第一个节点,指向表头的first域)。为什么要设计成这样?
一般的单链表通常定义如下:

  1. struct node {
  2.    struct node *next;
  3. };

对于这样的链表,在指定节点pCur后插入节点pNode很容易:

  1. pNode->next = pCur;
  2. pCur->next  = pNode;

但是要在指定节点pCur前插入pNode则很麻烦, 必须找到pCur的前一个结点pPre,然后执行操作:

  1. pPre->next = pNode;
  2. pNode->next = pCur;

也就是花费一定的时间用来搜索pCur的前一个节点, linux 为了提高执行效率, 采用了大家熟知的以空间换时间的方案, 添加pprev域, 指向前一个节点的next域,在执行前向插入时无需搜索, 只需执行如下操作就可以了:

  1. *(pCur->ppre) = pNode;
  2. pNode->next = pCur;

Linux 的确是在很多地方都注意提高效率。

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