当前位置: 技术问答>linux和unix
(在线等) 问个哈希桶的数据结构中那个二级指针的问题
来源: 互联网 发布时间:2017-01-23
本文导语: struct hlist_head { struct hlist_node *first; }; struct hlist_node { struct hlist_node *next, **pprev; }; 我把struct hlist_node的结构换为: struct hlist_node { struct hlist_node *next, *pprev; }; 程序依旧可以运行,我就...
struct hlist_head {
struct hlist_node *first;
};
struct hlist_node {
struct hlist_node *next, **pprev;
};
我把struct hlist_node的结构换为:
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
以删除一个元素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;
就这个道理,一级指针和二级指针,作用很不同。
一个哈希表是这样的: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;
就这个道理,一级指针和二级指针,作用很不同。