日期:2014-05-16  浏览次数:20607 次

(在线等) 问个哈希桶的数据结构中那个二级指针的问题
C/C++ code


struct hlist_head {
      struct hlist_node *first;
};
struct hlist_node {
      struct hlist_node *next, **pprev;
};



我把struct hlist_node的结构换为:

C/C++ code


struct hlist_node {
      struct hlist_node *next, *pprev;
};




程序依旧可以运行,我就是不理解这里为什么需要二级指针,可以通俗点给我说明白么?我在网上找说是因为要判断是不是first结点,但我还是不明白,谢谢回答!!!!

------解决方案--------------------
这里的pprev不是指向前一个元素的指针,而是指向前一个元素next指针的指针,所以它得是二级指针
以删除一个元素n来说,这样设计的好处在于,你的接口只需要给入要删除的元素
如rem_ele(struct hlist_node *ele);
因为n->pprev相当于n的前一个元素(假设是m)的next指针,所以只需要n->pprev = n->next就够了
可以参考下:
http://blog.csdn.net/qy532846454/article/details/5207298
------解决方案--------------------
很简单,需要修改哈希表桶数组。

一个哈希表是这样的:hlist_node* *hash_tables;

hash_tables[5]=NULL;

然后你插入了一个node,于是node->next=hash_tables[5]; hash_table[5]=node; node->pre=null;

现在hash_tables[5]=node; 相当于把Node插入到hash_tables[5]的头部,node现在就是头。

删除node,发现node->pre==null,所以判定node是一个桶的第一结点,删除第一个Node不是这样:
node->pre=node->next; delete node; 
而是要让hash_talbes[5]=node->next; 这时候就必须要hlist_node* *pre了:
*node->pre=node->next;

hash_tables* [100]; 这样写也许你能理解的更清楚点,你可以改变node->pre->next,但你不能这样改变hash_tables[5],除非你取到&hash_talbes[5],也就是hlist_node **pre。 然后*pre=node->next;

就这个道理,一级指针和二级指针,作用很不同。