散列表,每个散列表单元格上的相同记录

时间:2015-04-26 12:12:30

标签: c hashtable

文本文件中有一个单词字典。我将哈希所有这些词。我写了一些代码,但是有一个问题。最后一个字发生在每个哈希表记录上。

main()
{
   FILE *fp;
   char word[100];
   char *hash[569];
   int i;
   for(i=0;i<569;i++)
      hash[i]="NULL";


   int m=569;
   int z =569;
   int mm=568;
   char w;

   int key;
   int j;
   int hash1;
   int hash2;
   fp=fopen("smallDictionary.txt","r");
   int counter =0;
   while(fscanf(fp,"%s",word)!=EOF)
   {
    j=0;
    counter++;

      for(i=key=0;i<strlen(word);i++)
         key+=(word[i]-'a')*26*i;
      hash1=key%m;
      hash2=1+(key%mm);
      while(hash[(hash1+j*hash2)%m]!="NULL")
      {
             j++;          
      }
      hash[(hash1+j*hash2)%m] = word;
   }

  for(i=0;i<569;i++)
      printf("%s ",hash[i]);

   fclose(fp);
}

在控制台上结束结果。

enter image description here

正如它所看到的,作为字典的最后一句话,&#34;你的&#34;关键字重复。

字典内容:

  

大约在上面绝对可以接受的算法之后添加相邻   还有一个分析和任何人作为任务的论点   假设在可用的情况下可以在鸟体下方但不能   大写案例中心链链接变换字符检查   检查员检查选择类代码碰撞碰撞   命令编译编译编译的复杂性符合   包含包含便利转换纠正更正创建   创建交叉调试12月决定扣除已删除   部门词典发现讨论划分文件   动态文档因动态最容易遇到足够的错误   错误等甚至完全是示例可执行扩展经验因素   公平的秋天文件文件找到第一个以下字体为第四发现四   星期五从函数函数g gain一般生成生成   生成geoff得到网格给予优秀的评分者成长指南   有头发处理有散列哈希有头头帮助帮助   家庭作业时间我如何包含不正确的信息   输入插入插入插入指令是ispell它   保持已知的kuenning最后长度减去字母像线   线性列表加载长得更久看起来低低维持   许多匹配可能消息方法午夜可能错误拼写错误模式   更多的必须我的名字必须名字必须永远不需要注意   一次只有一个选项或原始其他输出的数量   概述页面对迂腐点政策可能性   更喜欢初级探究问题产生教授计划   目的嘎嘎二次快速阅读理由合理参考参考   重新提交重新报告重新提交同样保存单独   严重分离应该类似简单的简单单一尺寸   某些规格指定拼写拼写标准统计   字符串强提交提交提交成功建议   建议支持假设表技术比那时他们   这些这三个星期四的星期一起冠名   跟踪传统的转换试验尝试了解乳房下了解   不像以上使用使用通常的变种版本墙有用   病房警告是我们什么时候何时哪个空白谁为什么   狂野将风线缠绕与单词单词作品写错了你   您的

2 个答案:

答案 0 :(得分:1)

哈希表中的所有指针都指向同一个变量:word数组。无论你放在word中的最后一个字符串是什么,都将是输出中打印的字符串。

您需要为每个单词分配内存,方法是将hash数组放入数组并将单词复制到辅助数组中,或者使用例如strdup动态分配字符串。

更多图形化,它可能是这样的:

+---------+
| hash[x] | -\       +------+
+---------+   >--- > | word |
| hash[y] | -/       +------+
+---------+     +--------+
| hash[z] | --> | "NULL" |
+---------+     +--------+

此处,条目xy都指向word,而条目z指向您初始化所有条目的字符串文字"NULL"。< / p>

答案 1 :(得分:1)

hash[(hash1+j*hash2)%m] = word;

只是将word的地址分配给哈希条目。哪个总是一样的。在循环结束时,word的内容显然是fscanf读取的最后一个内容。所以你需要这样的东西:

hash[(hash1+j*hash2)%m] = strdup(word);

strdup分配堆内存,所以不要忘记在不再需要哈希表时释放它。