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

基于链表数组的C++哈希表实现问题:添加节点无数据写入

哈希表无法写入数据的问题排查

我帮你梳理了代码里的问题,核心是指针传递的逻辑错误,还有文件读取的小坑,咱们一步步拆解:

1. 核心问题:指针参数的传递方式错误

你写的add_nod函数第一个参数是nod *p,这是值传递——函数里拿到的p只是原哈希表数组中p[i]的一个副本。当你在函数里给p分配新节点(p = new nod;)时,修改的只是这个副本指针,原数组里的p[i]还是NULL,自然看不到任何数据写入。

解决方法很简单,把第一个参数改成引用传递,让函数里的修改能同步到原数组的指针上:

void add_nod(nod *&p, nod *&u, int info) { // 这里把p改为引用类型
    if (p == NULL) {
        p = new nod;
        p->info = info;
        u = p;
        u->next = NULL;
    } else {
        nod *c = new nod;
        c->info = info;
        u->next = c;
        u = c;
        u->next = NULL;
    }
}

2. 文件读取的逻辑漏洞

你用while (!f.eof())循环读取操作的写法很容易出问题——eof()只有在读取失败后才会返回true,比如文件读完最后一组数据后,f >> op >> x会失败,这时候才会触发eof(),但之前的循环可能会多执行一次,导致读取无效数据。

而且输入文件开头已经给出了操作次数7,更稳妥的做法是基于这个次数循环:

f >> nr_op;
// 替换原来的while (!f.eof())
for (int i = 0; i < nr_op; i++) {
    f >> op >> x;
    // 后续的op判断逻辑保持不变
}

3. 文件名匹配问题

代码里打开的输入文件是hashuri.in,但你提到输入文件是permutari.in,记得把文件名改一致,不然程序根本读不到输入数据:

ifstream f("permutari.in"); // 改成你的实际输入文件名

修复后的效果

把这几个问题修正后,再运行程序,就能看到哈希表的链表中正确写入数据了。比如操作2 7会把7放到7%127=7的链表中,2 20会放到20的链表中,后续的查询操作也能正常工作。

内容的提问来源于stack exchange,提问作者N. Nae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:21:22