试着在C中写一个HASH TABLE,我在这里做对了吗?

时间:2011-10-20 01:15:55

标签: c linked-list hashtable

所以我已经给了我一个哈希函数。

我有一个对象结构:

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添加到哈希中。

2 个答案:

答案 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。见下文评论