求助:C++中无法将文本文件每个单词存入双向链表的问题
帮你排查双向链表存储单词的问题
嘿,刚接触编程和链表的话遇到这种问题太正常啦!我来帮你捋捋大概率出问题的地方,再给你一个可以参考的正确实现~
常见错误原因分析
根据你描述的“仅重复存储最后一个字符‘.’两次”的现象,大概率是下面这几个问题导致的:
1. 错误的文件读取循环逻辑
很多新手会用 while (!file.eof()) 来判断文件是否读完,但这个写法有坑:eof() 只有在读取操作已经越过文件末尾时才会返回true,所以最后一次读取(已经到文件末尾)会失败,但你仍然会执行添加节点的代码,而此时用来存单词的变量还保留着最后一次成功读取的值(也就是那个点),于是就多添加了一次,出现两次相同的内容。
2. 未正确创建新节点
如果在循环里没有每次为新单词分配新的节点内存(比如复用同一个节点指针,只修改它的 num 值),那所有链表节点都会指向同一块内存空间,最后所有节点显示的都会是最后一次赋值的内容。不过结合你说的“两次”,更可能是和上面的读取错误叠加导致的。
3. 链表插入逻辑混乱
如果插入节点时没有正确遍历到链表末尾,或者没设置好 prev 和 next 指针,可能会导致链表结构出错,看起来只保留了最后两个节点。
参考正确实现
给你一个完整的可参考代码,你可以对比自己的代码找差异:
#include <iostream> #include <fstream> #include <string> using namespace std; struct node { struct node *next; string num; struct node *prev; }; struct node *create_ll(struct node *start) { // 打开文件,替换成你的文件名 ifstream input_file("your_file.txt"); if (!input_file.is_open()) { cout << "哎呀,打不开文件!检查下文件名和路径哦~" << endl; return start; } string word; // 正确的读取方式:读取成功才进入循环 while (input_file >> word) { // 每次都创建新的节点 struct node *new_node = new node; new_node->num = word; new_node->next = nullptr; new_node->prev = nullptr; if (start == nullptr) { // 链表是空的,第一个节点直接作为头 start = new_node; } else { // 遍历到链表末尾,插入新节点 struct node *temp = start; while (temp->next != nullptr) { temp = temp->next; } temp->next = new_node; new_node->prev = temp; } // 可以加个打印,看看每次读取和插入的内容是否正确 cout << "已插入单词:" << word << endl; } input_file.close(); return start; } // 可以加个打印链表的函数,验证结果 void print_ll(struct node *start) { struct node *temp = start; cout << "\n链表内容:"; while (temp != nullptr) { cout << temp->num << " "; temp = temp->next; } cout << endl; } int main() { struct node *start = nullptr; start = create_ll(start); print_ll(start); return 0; }
调试小技巧
你可以在自己的代码里加一些打印语句:
- 每次读取单词后,打印出当前读取到的内容,确认程序真的读到了所有单词;
- 每次创建节点后,打印节点的内容和地址,确认每个节点都是新的、内容正确。
这样就能快速定位到底是读取环节还是链表操作环节出了问题~
内容的提问来源于stack exchange,提问作者Vivank
相关产品推荐
相关产品推荐

