C++ 通过从循环C+中的文件中读取文本来创建链接列表+;

C++ 通过从循环C+中的文件中读取文本来创建链接列表+;,c++,file,text,linked-list,C++,File,Text,Linked List,我有一个家庭作业,要求我从文本文件中创建一个链表,其中有两个重要的注意事项 无阵列 无载体 真的,我对链表有一些很好的理解,但在我的程序中,我似乎有点不及格。通常,我会收到这些错误代码,比如无法访问traverse->next节点。我经常检查遍历->下一个节点,以便遍历我的链接列表 现在,我没有收到任何错误代码。在我的链接列表中有一个cout语句,它告诉我遍历节点至少(至少有一点)等于我的文本文件的输出。它在while循环中显示正确的信息,但当我打印它时。。。。信息消失了 我最好的猜测是我的程序

我有一个家庭作业,要求我从文本文件中创建一个链表,其中有两个重要的注意事项

  • 无阵列

  • 无载体

  • 真的,我对链表有一些很好的理解,但在我的程序中,我似乎有点不及格。通常,我会收到这些错误代码,比如无法访问traverse->next节点。我经常检查遍历->下一个节点,以便遍历我的链接列表

    现在,我没有收到任何错误代码。在我的链接列表中有一个cout语句,它告诉我遍历节点至少(至少有一点)等于我的文本文件的输出。它在while循环中显示正确的信息,但当我打印它时。。。。信息消失了

    我最好的猜测是我的程序没有正确链接到我的列表。然而,如果是这样的话,我还没有弄清楚如何正确地将它们链接起来

    有人能给我一些提示或建议吗?这实际上是赋值的第一部分(因此是“InitList()”函数名),但我正努力让它工作

    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    
    struct Node
    {
        string fName;
        string lName;
        double hours;
        double pay;
        int unionCode;
        int id;
    
        Node *next;
    
    }; Node *head = nullptr;
    
    //standard node struct with a global root node so I don't have to pass it everytime
    
    
    void InitList();
    void AddRecord();
    void PrintList();
    
    //prototypes
    
    
    
    int main()
    {
    
        InitList(); 
    
        PrintList();
    
        int options;
    
        cout << "MENU\n" <<
            "______________________________\n" <<
            "1: Add a Record\n" <<
            "2: Modify a Record\n" <<
            "3: Display a Record\n" <<
            "4: Display a Summary\n" <<
            "5: Display File\n" <<
            "6: Exit Program\n" << endl;
    
        cin >> options;
    
    
        switch (options)
        {
            case 1:
                AddRecord();
                break;
    
            default:
                break;
        }
    
    
    }
    
    void AddRecord()
    {
        fstream file;
        file.open("PATH.txt", ios::app);
    
        file.close();
    
    
    }
    
    void InitList()
    {
        //initializes the linked list from here on out, all changes made are    
        //reflected on the list 
        //and the text doc until the program quits
    
        fstream file;
        file.open("PATH.txt");
    
        Node *add;
        Node *traverse = head; //set traverse pointing to head
    
    
        while (file.good()) //I realize this isn't ideal, but it's temporary to get it working
        {
    
            add = new Node;
    
            file >> add->fName
                >> add->lName
                >> add->id
                >> add->pay
                >> add->hours
                >> add->unionCode;
    
            add->next = nullptr;
    
            if (traverse)
            {
                while (traverse->next)
                {
                    traverse = traverse->next;
                }
    
                traverse->next = add;
                cout << traverse->fName << endl;
            }
            else
            {
                head = add;
                cout << head->fName << endl;
            }
        }
        file.close();
    
    }
    
    
    //simple Printing function... this is that part that's printing out ONLY the head value and nothing else (hence my assumption that head isn't linked)
    void PrintList()
    {
        Node *traverse = head;
    
        while (traverse->next)
        {
            cout << traverse->fName << " " << traverse->lName << " " << traverse->id << " $" << traverse->pay << " " << traverse->hours << " " << traverse->unionCode << endl;
    
            traverse = traverse->next;
        }
    
    }
    
    #包括
    #包括
    #包括
    使用名称空间std;
    结构体类型
    {
    字符串fName;
    字符串名称;
    双倍小时;
    双薪;
    国际统一代码;
    int-id;
    节点*下一步;
    }; 节点*head=nullptr;
    //具有全局根节点的标准节点结构,因此我不必每次都传递它
    void InitList();
    void AddRecord();
    作废打印列表();
    //原型
    int main()
    {
    InitList();
    打印列表();
    int选项;
    无法>添加->标识
    >>添加->支付
    >>添加->小时数
    >>添加->工会代码;
    添加->下一步=nullptr;
    如果(遍历)
    {
    while(遍历->下一步)
    {
    遍历=遍历->下一步;
    }
    遍历->下一步=添加;
    cout fName
    这就是我修复它的方法(代码位于INT MAIN()中)。基本上,我将数据传输到Node*add,然后将其传递给一个普通的链表add函数。我通过引用传递它。有人能解释为什么它以前不工作吗?我猜这与“遍历”的值没有重置为“头”有关我已经习惯了,不然我怎么能把它修好呢


    在循环中创建链表时,最好使用迭代函数并传递遍历、像我那样迭代函数,还是像我失败的那样使用复杂的嵌套循环系统?

    第二步……我可以创建一个while循环……将节点传递给更简单的add函数,然后将节点添加到列表中?这似乎更简单。
    while (file.good())
    {
        Node *add = new Node;
    
        file >> add->fName >> add->lName >> add->id >> add->pay >> add->hours >> add->unionCode;
        add->next = nullptr;
    
        InitList(add);
    
    }