Односвязный список C ++ ostream и istream - выводит адреса памяти - PullRequest
0 голосов
/ 25 апреля 2011

Я действительно новичок в этом и сейчас изучаю односвязные списки. Я пишу код, но я действительно в замешательстве. Я пытаюсь написать метод чтения и метод записи. У меня есть тестовый жгут, который я не могу изменить. Я просто хочу иметь возможность читать поток и выводить поток, чтобы он не возвращался с адресами памяти.

Может кто-нибудь объяснить действительно простым способом, пожалуйста, и помогите мне исправить этот код?

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;
}

спасибо!

Ответы [ 2 ]

3 голосов
/ 25 апреля 2011

Ваш метод записи кажется немного испорченным.Вы хотите писать элементы, а не создавать новые.Что-то вроде этого должно работать лучше:

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, пока сохраняется другой файл.Добавить это?Сначала удалить старый список?

1 голос
/ 25 апреля 2011

В вашем методе Write () вы сокращаете весь список, выполняя

Node *node = new Node;
head = node;

Это заменяет весь список пустым списком, если вы спросите меня. NumberOfInts больше не является правильным, и вы продолжаете печатать один и тот же узел-> data NumberOfInts раз.

Я не знаю с чего начать.

...