CS50x问题集5:是否正确将链表加载到哈希表中?
你的哈希表加载代码逻辑全错了
先直接给结论:table[i] = n;这步不仅逻辑有问题,整个链表插入的流程都错了——现在没报错只是程序没崩溃,但实际字典根本没正确加载,后续依赖这个哈希表的函数肯定会出问题。
具体错在哪
- 重复分配节点纯浪费:你循环里先后malloc了
n和new_node两个节点,只有n复制了单词内容,new_node的word字段是空的,完全没用还白白占用内存。 - 链表插入逻辑颠倒+覆盖旧数据:你先把存了单词的
n放到哈希桶头部,接着又把空的new_node设为新的桶头,等于每次循环都把之前加载的链表全丢了。最后每个桶里只会剩下一个空节点和它指向的最后一个单词,之前加载的所有单词都没保留。
正确的头插法写法(哈希表链表标准插入方式)
只需要分配一个节点,步骤简单明了:
while(fscanf(file, "%s", word) != EOF){ // 只为当前单词分配一个节点 node *n = malloc(sizeof(node)); if(n == NULL){ printf("内存分配失败\n"); fclose(file); // 严谨点还要清理已加载的节点避免内存泄漏 return false; } // 复制单词到节点 strcpy(n->word, word); // 计算哈希索引 unsigned int i = hash(word); // 头插核心:先让新节点指向原来的桶头 n->next = table[i]; // 再把桶头更新为新节点 table[i] = n; }
额外要改的小问题
- 原代码里malloc失败的提示写的是
Unable to open,完全驴唇不对马嘴,要改成内存分配失败的提示 - 原代码中malloc失败时直接return,没关文件,会导致资源泄漏,要先执行
fclose(file)再返回
内容的提问来源于stack exchange,提问作者Carl Fampo
相关产品推荐
相关产品推荐

