【问题标题】:How to insert structures into a hashing function in C?如何将结构插入到 C 中的散列函数中?
【发布时间】:2015-01-05 18:54:06
【问题描述】:

我完成了我的哈希函数,现在它似乎打印了相同的地址而不是所有地址。它也只是一遍又一遍地打印完全相同的地址我几乎可以肯定错误在“Put”函数中,因为它是添加到结构数组中的那个。但我将所有代码都留在这里,以防错误出现在其他地方。我从一个文件中获取数据,用于测试任何可以使用 ASCII 文件的文件。提前感谢您的建议!

我制作的结构在这里:

typedef struct HashNode{
char* key;
int data; 
struct HashNode* next;
} HashNode;

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

它们一定有问题,因为它们没有保存我在其中输入的内容。

【问题讨论】:

  • hashtable->hashArray = malloc(sizeof(HashNode*)*TABLE_LENGTH); 或者更清楚:hashtable->hashArray = malloc(sizeof(TABLE_LENGTH * sizeof *hashtable->hashArray);
  • in Put() node->key = keyWord;指原始关键字,由调用者的word 提供。你需要在这里strdup()
  • 请进一步解释!目前,claptrap 的评论发生了一些变化,它必须为每个输出打印不同的值,但是打印出来的单词似乎一直都是一样的。这是文本文件中的最后一个单词。谢谢
  • 另外:在很多地方(循环)你引用TABLE_LENGTH,你已经通过hashtable->size = TABLE_LENGTH;将该值存储在哈希表结构中,你可以引用hashtable->size而不是常数。
  • 顺便说一句,我是从第一个函数打印的——最后一个 if 语句。现在似乎是打印问题,我也在寻找要解决的问题。

标签: c algorithm struct hashtable


【解决方案1】:

在您编写的代码中

// 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

【讨论】:

  • 非常好的观察,拍手先生让我检查一下它是否有很大的不同!
  • 好的,我们取得了一些进展!!现在它正在打印不同的数字,但仍然是相同的单词......输出:作品,2911作品,1作品,1作品,2作品,10作品,3作品,1作品,1作品,4作品,2作品
【解决方案2】:

Put 始终将相同的字符串word 作为键放入您的哈希中。该字符串被反复覆盖并具有最后一个键的内容。 (更糟糕的是,节点的 has 值不会匹配除最后一个之外的键。)

解决此问题的一种方法是让哈希表拥有键:复制它们(可能使用strdup)或将结构中的键设置为数组并将strcpy 设置为数组。当您复制它们时,您必须仅在第一次将键插入到 has 表时这样做,而不是在现有键的值被覆盖时这样做。当你使用数组时,你显然可以只处理一定长度的字符串。

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

编辑:您用于读取单词的代码将单词限制为 32 个字符(不强制执行该限制!)。因此,对您的代码的快速修复是使您的节点中的 key 条目成为 32 个字符的数组:

typedef struct HashNode {
    char key[32];
    int data;
    struct HashNode *next;
} HashNode;

然后您必须将内容复制到Put 中的密钥。替换

node->key = keyWord;

与:

strcpy(node->key, keyWord);

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

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

【讨论】:

  • 正确!我将如何解决空字符串问题??
  • 只有letters > 0,您才能在表格中使用Put字词。
  • 谢谢!我当时没有这样做
猜你喜欢
  • 2020-08-27
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2013-11-09
  • 2020-07-08
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多