文本文件中有一个单词字典。我将哈希所有这些词。我写了一些代码,但是有一个问题。最后一个字发生在每个哈希表记录上。
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);
}
在控制台上结束结果。
正如它所看到的,作为字典的最后一句话,&#34;你的&#34;关键字重复。
字典内容:
大约在上面绝对可以接受的算法之后添加相邻 还有一个分析和任何人作为任务的论点 假设在可用的情况下可以在鸟体下方但不能 大写案例中心链链接变换字符检查 检查员检查选择类代码碰撞碰撞 命令编译编译编译的复杂性符合 包含包含便利转换纠正更正创建 创建交叉调试12月决定扣除已删除 部门词典发现讨论划分文件 动态文档因动态最容易遇到足够的错误 错误等甚至完全是示例可执行扩展经验因素 公平的秋天文件文件找到第一个以下字体为第四发现四 星期五从函数函数g gain一般生成生成 生成geoff得到网格给予优秀的评分者成长指南 有头发处理有散列哈希有头头帮助帮助 家庭作业时间我如何包含不正确的信息 输入插入插入插入指令是ispell它 保持已知的kuenning最后长度减去字母像线 线性列表加载长得更久看起来低低维持 许多匹配可能消息方法午夜可能错误拼写错误模式 更多的必须我的名字必须名字必须永远不需要注意 一次只有一个选项或原始其他输出的数量 概述页面对迂腐点政策可能性 更喜欢初级探究问题产生教授计划 目的嘎嘎二次快速阅读理由合理参考参考 重新提交重新报告重新提交同样保存单独 严重分离应该类似简单的简单单一尺寸 某些规格指定拼写拼写标准统计 字符串强提交提交提交成功建议 建议支持假设表技术比那时他们 这些这三个星期四的星期一起冠名 跟踪传统的转换试验尝试了解乳房下了解 不像以上使用使用通常的变种版本墙有用 病房警告是我们什么时候何时哪个空白谁为什么 狂野将风线缠绕与单词单词作品写错了你 您的
答案 0 :(得分:1)
哈希表中的所有指针都指向同一个变量:word
数组。无论你放在word
中的最后一个字符串是什么,都将是输出中打印的字符串。
您需要为每个单词分配内存,方法是将hash
数组放入数组并将单词复制到辅助数组中,或者使用例如strdup
动态分配字符串。
更多图形化,它可能是这样的:
+---------+ | hash[x] | -\ +------+ +---------+ >--- > | word | | hash[y] | -/ +------+ +---------+ +--------+ | hash[z] | --> | "NULL" | +---------+ +--------+
此处,条目x
和y
都指向word
,而条目z
指向您初始化所有条目的字符串文字"NULL"
。< / p>
答案 1 :(得分:1)
hash[(hash1+j*hash2)%m] = word;
只是将word
的地址分配给哈希条目。哪个总是一样的。在循环结束时,word
的内容显然是fscanf读取的最后一个内容。所以你需要这样的东西:
hash[(hash1+j*hash2)%m] = strdup(word);
strdup
分配堆内存,所以不要忘记在不再需要哈希表时释放它。