我完成了哈希函数,现在它似乎打印了相同的地址而不是所有地址。它也只是反复打印完全相同的地址我几乎可以肯定错误是在" Put"函数,因为它是一个添加到结构数组的那个。但是我把这里的所有代码都保留在这里以防万一。我从一个文件中获取数据,用于测试ASCII中的任何文件都可以使用。感谢您的建议!
我所建造的结构在这里:
typedef struct HashNode{
char* key;
int data;
struct HashNode* next;
} HashNode;
typedef struct Hashtable{
int size;
struct HashNode** hashArray;
} Hashtable;`
他们肯定有问题,因为他们不会保留我输入的内容。
答案 0 :(得分:0)
在您编写的代码中
// 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
答案 1 :(得分:0)
您Put
始终将相同的字符串word
作为密钥存入您的哈希。该字符串反复过载并具有最后一个键的内容。 (更糟糕的是,除了最后一个节点之外,节点的有效值将不匹配。)
解决此问题的一种方法是使哈希表拥有密钥:复制它们(可能使用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
计算,而不是由客户端代码计算,以强制执行相同的哈希函数。