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

求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:52:43