基于链表数组的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
相关产品推荐
相关产品推荐

