我完成了我的散列功能,现在它似乎在打印相同的地址,而不是所有的地址。而且,它只是一次又一次地打印完全相同的地址--我几乎可以肯定错误在"Put“函数中,因为它是添加到结构数组中的这个函数。但是我把所有的代码都留在这里以防bug在别的地方。我从一个文件中获得数据,用于测试ASCII中任何可以使用的文件。谢谢你提前给我建议!
我做的结构在这里:
typedef struct HashNode{
char* key;
int data;
struct HashNode* next;
} HashNode;
typedef struct Hashtable{
int size;
struct HashNode** hashArray;
} Hashtable;`
他们一定是出了什么问题,因为他们不掌握我所输入的东西。
发布于 2014-11-09 03:19:47
您总是将相同的字符串( word
)作为键放入您的散列中。该字符串正在反复被改写,并且具有最后一个键的内容。(更糟糕的是,除了最后一个节点之外,节点的has值将与键不匹配。)
解决这一问题的一种方法是使哈希表拥有这些键:要么复制它们(可能使用strdup
),要么将结构中的键作为数组,并将strcpy
复制到其中。当您复制它们时,必须只在第一次将键插入has表时才这样做,而不是当覆盖现有键的值时才这样做。当您使用数组时,您可以避免只处理长度不超过某一长度的字符串。
另一种方法是确保所有键都指向不同的内存地址。如果将整个输入存储在内存中,并将键指针输入到该内存中,可能是来自strtok
的结果,情况就是这样。输入内存必须至少与哈希表一样长。
编辑:用于阅读单词的代码将单词限制为32个字符(而不强制执行该限制!)因此,对代码的快速修正是将youir节点中的key
条目设置为由32个字符组成的数组:
typedef struct HashNode {
char key[32];
int data;
struct HashNode *next;
} HashNode;
然后,必须将内容复制到Put
中的键中。替换
node->key = keyWord;
通过以下方式:
strcpy(node->key, keyWord);
这将使计数工作,但您的代码仍然有其他几个问题。例如:
Put
中预先为节点分配内存,只有在真正需要一个新节点的情况下。否则你会漏掉记忆。Put
计算,而不是由客户端代码计算,以强制始终使用相同的哈希函数。发布于 2014-11-09 03:11:18
在你的代码中你写
// 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,即当键匹配时:
if(!strcmp(hashtable->hashArray[value]->key, node->key)) {
hashtable->hashArray[value]->data += node->data;// +1
https://stackoverflow.com/questions/26827380
复制