c++ - 将文本文件读入双向链表并输出 - C++

标签 c++ eclipse pointers linked-list doubly-linked-list

我正在尝试读入一个文件并使用双向链表来存储数据并输出存储的数据。但是每当我运行我的程序时,它什么都不输出并终止。我编译代码没有错误。

带有预处理器指令和结构的头文件

#include <iostream>
#include <fstream>
using namespace std;

typedef struct sentry  sentry;

struct stud
{
   string term;
   string title;
   string description;
   string tktNum;
   string location;
   string lecDay;
   string instructor;
   string labLoc;
   string labDay;
   string labInstruct;
   string units;
   string preReqs;
   string grade;
};
struct slist
{
    int length;
    sentry *first;
    sentry *last;
};
struct sentry
{
    slist *list;
    sentry *next;
    sentry *prev;
    stud *data;
};

void readFile(slist *&header);

我的 main.cpp 调用读取文件函数并输出

#include "header.h"

int main()
{
    slist *header = NULL;

    sentry *temp, *node;
    temp = header->first;

    readFile(header);

    for(int i=0; i<header->length; ++i)
    {
        cout << node->data->term << endl;
        cout << node->data->title << endl;
        cout << node->data->description << endl;
        cout << node->data->tktNum << endl;
        cout << node->data->location << endl;
        cout << node->data->lecDay << endl;
        cout << node->data->instructor << endl;
        cout << node->data->labLoc << endl;
        cout << node->data->labInstruct << endl;
        cout << node->data->units << endl;
        cout << node->data->preReqs << endl;
        cout << node->data->grade << endl;

        node-> prev = header-> last;
        node-> next = NULL;
        temp = header -> last;
        temp-> next = node;
        header-> last = node;
        node = temp->prev;
    } 

    return 0;
}

我的 readFile 函数 - 它从文本文件中读取数据并将数据存储到链表中

#include "header.h"

void readFile(slist *&header)
{
    ifstream fin;
    sentry *node, *temp;

    fin.open("data.txt");
    while(!fin.eof())
    {
        if(header == NULL)
        {
            header = new slist;
            header-> length = 0;
            header-> first = NULL;
            header-> last  = NULL;

            node = new sentry;
            header-> first = node;
            header-> last  = node;
            node-> prev = NULL;
            node-> next = NULL;
         }else
        {
            node = new sentry;
            node-> prev = header-> last;
            node-> next = NULL;
            temp = header -> last;
            temp-> next = node;
            header-> last = node;
        }
        node->data = new stud;
        getline(fin, node->data->term);
        getline(fin, node->data->title);
        getline(fin, node->data->description);
        getline(fin, node->data->tktNum);
        getline(fin, node->data->location);
        getline(fin, node->data->lecDay);
        getline(fin, node->data->instructor);
        getline(fin, node->data->labLoc);
        getline(fin, node->data->labDay);
        getline(fin, node->data->labInstruct);
        getline(fin, node->data->units);
        getline(fin, node->data->preReqs);
        getline(fin, node->data->grade);
        header->length++;
    }
}

我的data.txt文件(用来读取数据的文本文件)

Fall 2222
CS101
Computer Science Intro
12345
SCI546
MWF 1230PM
John Doe
SCI547
MWF 230PM
John Doe
4
N/A
B

Spring 111
English 101
Intro to English
6789
LI123
TTH 130PM
Jane Doe
N/A
N/A
N/A
N/A
3
N/A
A

最佳答案

slist *header = NULL;

你永远不会为 header 分配任何东西。 header 始终为 NULL。另外最好称它为list,而不是header。你需要:

slist list;

您有其他未初始化的指针,例如 sentry *node; 除非它指向某物,否则您不能使用它。

您在某些部分使用了 C 风格的声明。 C类结构可以如下:

typedef struct sentry_t sentry; //in C

在 C++ 中,您可以简单地编写 struct sentry;

但你实际上并不需要这个。您需要以下结构:

struct stud
{
    ... as before
};

struct snode
{
    stud data;
    snode *next;
    snode *prev;
};

struct slist
{
    int length;
    snode *head;
    snode *tail;
};

slist 是双向链表,snode 是它的节点。

请注意,我更改了结构,现在 stud 包含在 snode 中,因此您无需使用 new 进行单独分配> (在实际应用中你必须释放所有的内存,你要避免不必要的分配)

现在您可以声明并初始化您的列表:

int main()
{
    //declare and initialize the list
    slist list;
    list.head = NULL;
    list.tail = NULL;
    list.length = 0;

    readFile(list);

    snode *node = list.head;
    for(int i = 0; i < list.length; i++)
    {
        cout << node->data.term << endl;
        cout << node->data.title << endl;
        cout << node->data.description << endl;
        ...
        node = node->next;
        cout << "\n";
    }

    return 0;
}

读取函数应该是这样的:

void readFile(slist &list)
{
    ifstream fin("file");
    while(fin.good())
    {
        snode *node = new snode;
        if(list.head == NULL)
        {
            node->prev = NULL;
            node->next = NULL;
            list.head = node;
            list.tail = node;
        }
        else
        {
            list.tail->next = node;
            node->prev = list.head;
            node->next = NULL;
            list.tail = node;
        }

        getline(fin, node->data.term);
        getline(fin, node->data.title);
        getline(fin, node->data.description);
        ...
        getline(fin, node->data.grade);
        list.length++;

        string blankline;
        if(!getline(fin, blankline))
            break;
    }
}

使用 fin.good() 而不是 !fin.eof()。请注意,您的文件中有一个空行。当它到达最后一行时,您想跳过它或中断循环。

关于c++ - 将文本文件读入双向链表并输出 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46923653/

相关文章:

安卓 - 安卓模拟器的任何替代品

c - 如何将二维字符指针发送到内存分配函数?

c++ - 从前序数组和中序数组构造 bst 时的错误

c++ - 将 Boost 添加到 Eclipse for C++ - 包括路径问题

c++ - 关于容器中元素的引用

Java 10 Eclipse + Maven "java.lang.module.FindException: Module myproject not found"

c - 如何用另一个二维数组的内容填充一个二维数组的内容(其维度由用户输入)?

C++ 返回对象

c++ - 算法成本

c++ - 在子类中重写时如何调用私有(private)虚拟基类实现