You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:35:25