0

我对此真的很陌生,现在正在学习单链表。我正在写一些代码,但我真的很困惑。我正在尝试编写读取方法和写入方法。我有一个我无法更改的测试工具。我只想能够读取流并输出流,这样它就不会返回内存地址。

谁能以非常简单的方式解释并帮助我修复此代码?

void SLLIntStorage::Read(istream& r)
{
    char c[13];
    r >> c;
    r >> NumberOfInts;

    Node *node = new Node;
    head = node; //start of linked list

    for(int i = 0; i < NumberOfInts; i++) //this reads from the file and works
    {
        r >> node->data;
        cout << node->data << endl;
        node ->next = new Node; //creates a new node
        node = node->next;
    }
}

void SLLIntStorage::Write(ostream& w)
{
    Node *node = new Node;
    head = node;

    for(int i = 0; i < NumberOfInts; i++)
    {
        w << node->data << endl;
        //cout << i << endl;
    }
}

并在头文件中

#pragma once

#include <iostream>

using namespace std;

struct Node
{
    int data; //data in current node
    Node *next; //link of address to next node
};

class SLLIntStorage
{

private:
    Node *head;// start of linked list
    //Node *tail;
    Node current; //current node
public:
    void setReadSort(bool);
    void sortOwn();

    void Read(istream&);
    void Write(ostream&);

    void add(int i);
    void del();

    bool _setRead;
    int NumberOfInts;

    SLLIntStorage(void);
    ~SLLIntStorage(void);
};

inline ostream& operator<< (ostream& out, SLLIntStorage& n) 
{
    n.Write(out); 
    return out;
}
inline istream& operator>> (istream& in, SLLIntStorage& s) 
{
    s.Read(in); 
    return in;
}

谢谢你!

4

2 回答 2

3

您的 write 方法似乎有点混乱。您想编写元素,而不是创建新元素。这样的事情应该会更好:

void SLLIntStorage::Write(ostream& w)
{
    Node *node = head;

    for(int i = 0; i < NumberOfInts; i++)
    {
        w << node->data << endl;
        node = node->next;
        //cout << i << endl;
    }
}

顺便说一句:你的实现似乎对我有用,你有一个潜在的大内存泄漏。一旦连续调用两次 Read 方法,旧列表将被丢弃而不释放内存。您应该考虑如果在保存另一个文件时调用 write,您的班级应该做什么。追加?先删除旧列表?

于 2011-04-25T18:52:51.403 回答
1

在您的 Write() 方法中,您通过执行来破坏整个列表

Node *node = new Node;
head = node;

如果您问我,这会将整个列表替换为一个空列表。NumberOfInts 不再正确,您继续打印相同的节点->数据 NumberOfInts 次。

我不知道从哪里开始。

于 2011-04-25T18:53:24.900 回答