所以我已经给了我一个哈希函数。
我有一个对象结构:
OBJKT
{
OBJKT *o_hash_next;
OBJKT *o_hash_prev;
... bunch of other stuff
}
我还在头文件中声明了哈希数组:OBJKT * hash_tbl [hsize];
应该将给定OBJKT添加到散列的方法接受散列键,以及我们正在添加的OBJKT。
所以这就是我不确定我做得正确的事情:
void insert_in_hash(int hashindex, OBJKT *thisObject)
{
*thisObject->o_hash_next = *hash_tbl[hashindex];
*hash_tbl[hashindex]->o_hash_prev=*thisObject;
*hash_tbl[hashindex] = *thisObject;
}
这看起来是否正确?我正在尝试设置上一个/下一个指针,然后将thisObject添加到哈希中。
答案 0 :(得分:0)
看起来正确。但是,对于哈希表,您不一定需要双向链表。
不要忘记将hash_tbl归零。
您可能会发现将哈希值直接放在OBJKT条目中很有用,以加快搜索速度。
基于未探索的评论(那些“*”字符),它可能看起来像这样:
void insert_in_hash(int hashindex, OBJKT *thisObject)
{
thisObject->o_hash_next = hash_tbl[hashindex];
thisObject->o_hash_prev = NULL;
hash_tbl[hashindex]->o_hash_prev=thisObject;
hash_tbl[hashindex] = thisObject;
}
答案 1 :(得分:0)
已经很晚了,我有点累了,但我看到的是额外的解除引用。
首先:OBJKT *hash_tbl[]
已经是指向链接列表的指针数组。
所以当你需要列表的头部时,你只需要使用hash_tbl[index]
,这会给你一个指针分配给你的thisObject->o_hash_next
也是一个指针。不要取消引用。你有*thisObject->o_hash_next = *hash_tbl[hashindex]
将值从一个地址复制到另一个地址,这不是我想要的。同样的事情适用于前一个指针。
您的解决方案可能如下所示:
void insert_in_hash(int hashindex, OBJKT *thisObject)
{
thisObject->o_hash_next = hash_tbl[hashindex];
hash_tbl[hashindex]->o_hash_prev = thisObject;
thisObject->o_hash_prev = NULL; // Don't forget to NULL if not in use
}
最后一行被删除了,因为这不是你通常跟踪列表头部的方式。
无论如何,正如我所说,现在已经很晚了,我没有时间测试我的代码,但这里是链接列表教程的有用链接:C/C++ Linked List tutorial
修改强>
您应该像在代码中一样保留列表的头部:hash_tbl[hashindex] = thisObject
。见下文评论