首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将结构插入到C中的散列函数?

如何将结构插入到C中的散列函数?
EN

Stack Overflow用户
提问于 2014-11-09 10:52:37
回答 2查看 861关注 0票数 0

我完成了我的散列功能,现在它似乎在打印相同的地址,而不是所有的地址。而且,它只是一次又一次地打印完全相同的地址--我几乎可以肯定错误在"Put“函数中,因为它是添加到结构数组中的这个函数。但是我把所有的代码都留在这里以防bug在别的地方。我从一个文件中获得数据,用于测试ASCII中任何可以使用的文件。谢谢你提前给我建议!

我做的结构在这里:

代码语言:javascript
运行
复制
typedef struct HashNode{
char* key;
int data; 
struct HashNode* next;
} HashNode;

typedef struct Hashtable{
int size;   
struct HashNode** hashArray; 
} Hashtable;`

他们一定是出了什么问题,因为他们不掌握我所输入的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-09 11:19:47

您总是将相同的字符串( word )作为键放入您的散列中。该字符串正在反复被改写,并且具有最后一个键的内容。(更糟糕的是,除了最后一个节点之外,节点的has值将与键不匹配。)

解决这一问题的一种方法是使哈希表拥有这些键:要么复制它们(可能使用strdup),要么将结构中的键作为数组,并将strcpy复制到其中。当您复制它们时,必须只在第一次将键插入has表时才这样做,而不是当覆盖现有键的值时才这样做。当您使用数组时,您可以避免只处理长度不超过某一长度的字符串。

另一种方法是确保所有键都指向不同的内存地址。如果将整个输入存储在内存中,并将键指针输入到该内存中,可能是来自strtok的结果,情况就是这样。输入内存必须至少与哈希表一样长。

编辑:用于阅读单词的代码将单词限制为32个字符(而不强制执行该限制!)因此,对代码的快速修正是将youir节点中的key条目设置为由32个字符组成的数组:

代码语言:javascript
运行
复制
typedef struct HashNode {
    char key[32];
    int data;
    struct HashNode *next;
} HashNode;

然后,必须将内容复制到Put中的键中。替换

代码语言:javascript
运行
复制
node->key = keyWord;

通过以下方式:

代码语言:javascript
运行
复制
strcpy(node->key, keyWord);

这将使计数工作,但您的代码仍然有其他几个问题。例如:

  • 如果有连续空格,则添加空字符串。
  • 您也不应该在Put中预先为节点分配内存,只有在真正需要一个新节点的情况下。否则你会漏掉记忆。
  • 哈希值应由Put计算,而不是由客户端代码计算,以强制始终使用相同的哈希函数。
票数 0
EN

Stack Overflow用户

发布于 2014-11-09 11:11:18

在你的代码中你写

代码语言:javascript
运行
复制
// if the address is populated, but the incoming node has the same key as the
// node in place just update the counter
if(strcmp(hashtable->hashArray[value]->key, node->key)) { 
        hashtable->hashArray[value]->data += node->data;// +1

但是注释似乎与您的代码不匹配,因为要匹配,您应该检查strcmp是否返回0,即当键匹配时:

代码语言:javascript
运行
复制
if(!strcmp(hashtable->hashArray[value]->key, node->key)) { 
        hashtable->hashArray[value]->data += node->data;// +1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26827380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档