如何从文本文件加载链接列表

How to load a linked list from a text file?

本文关键字:加载 链接 列表 文件 文本      更新时间:2023-10-16

问候我一直在做一个家庭作业,在这个作业中,我必须创建一个链表程序,该程序可以从文本文件中保存和恢复数据。我已经完成了大部分工作,但我在使用从中创建的文本文件中的数据恢复链表时遇到了一些问题。当我恢复它时,最后一个元素会重复两次。我相信这与循环有关,但由于我不确定我是否包括了我任务的整个范围。

以下是我迄今为止编写的程序代码:

ListNode.h

#pragma once
template<class T> class List;
template<class T>
class ListNode
{
 friend class List<T>;
public:
 ListNode(const T&);
 T getData()const;
private:
 T data;
 ListNode<T>*next;
};//end ListNode class
template<class T>
ListNode<T>::ListNode( const T &info):data(info), next(NULL)
{
}//end default constructor
template<class T>
T ListNode<T>::getData()const
{
 return data;
}//end function getData 

List.h

#pragma once
#include<iostream>
#include <fstream>
using namespace :: std;
#include "ListNode.h"
template<class T> 
class List 
{
private:
 ListNode<T> *head;
 int size;
 ListNode<T> *find(int index) const;
public:
 List();
 List(const List<T> &aList);
 ~List();
 int getLength() const;
 void insert (int index, T tempData);
 void remove(int index);
 void retrieve(int index, T &tempData);
 bool isEmpty() const;
 void print() const;
 void save();
 void restore();
};//end List class 

故障功能:

template <class T>
void List<T>::restore()
 {
     ifstream inFile;
     inFile.open("listFile.txt");
     T value=0;
     int index, check =0;
     cout << "Now reading the data from the text file..." << endl;
         //inFile >> value;
         //cout << "Value is : " << value << endl;

        while (inFile != NULL) 
        {
            inFile >> value;
            index = getLength();
            cout << value << endl;
            insert(index+1, value);
            inFile.close();
        } 

 } // end function restore

测试期间保存到文本文件的链接列表数据为:

35
45
55
65

当链接列表从文本文件中恢复时,这就是它的内容:

35
45
55
65
65

我该如何解决这个问题?

让我惊讶的是,您的restore函数竟然能工作。但是的,它在重复最后一个元素。试试这个:

while(inFile >> value)
  ...

编辑:
好吧,试试这个:

while(inFile >> value)
{
  cout << value << endl;
}

它是否正确显示值?

我的一个程序不久前遇到了这个问题。我花了一段时间才弄清楚,我不确定是否是同样的问题,但请再次检查您的输入文件。如果在最后一个数字后面多留一行,编译器将两次返回最后一个数值。

示例:

1

2

3

4

5

(额外线路)

只需删除多余的一行。

哪一个是您列表的头?您可以使用while循环,甚至if语句遍历每个节点并加载所有节点。