Конструктор копирования для простого односвязного списка, включая узлы C ++ - PullRequest
1 голос
/ 02 мая 2011

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

Вот мой заголовочный файл:

#pragma once

#include <iostream>
using namespace std;

class Node
{
public:
    int data;
    Node* next;
    Node()
    {
        next = NULL;
        data = 0;
    }
    Node(const Node& copyNode); /*: data(copyNode.data), next(copyNode.next ? new Node(*copyNode.next) : NULL)*/

};

class SLLIntStorage
{
public:
    Node* head;
    Node* current;
    Node* tail;

    void Read(istream&);
    void Write(ostream&);
    void setReadSort(bool);
    void sortOwn();
    void print();

    void mergeSort(Node**);
    Node *merge(Node*, Node*);
    void split(Node*, Node**, Node**);

    bool _sortRead;
    int numberOfInts;

    SLLIntStorage(const SLLIntStorage& copying) //: head(copying.head ? new Node(*copying.head) : NULL)
    {

    }

    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 ]

4 голосов
/ 02 мая 2011

Чтобы скопировать связанный список, вы должны выполнить итерацию всего связанного списка, сделать копию каждого из узлов и добавить это в новый список.Помните, что вы не просто копируете указатели, но вы должны копировать всю структуру Node и любые данные, которые также должны быть скопированы (например, если данные являются указателями, вам также необходимо выполнить их глубокое копирование).

Итак, вот пример конструктора копирования для вашего класса SLLIntStorage:

SLLIntStorage(const SLLIntStorage& copying) : head(NULL)
{
    Node* cur = copying.head;
    Node* end = NULL;

    while (cur)
    {
        Node* n = new Node;
        n->data = cur->data;

        if (!head) {
            head = n;
            end = head;
        } else {
            end->next = n;
            end = n;
        }

        cur = cur->next;
    }
}

Обратите внимание, что я не учел элементы данных tail и current и т. Д.придется учесть их.

1 голос
/ 02 мая 2011

Поскольку это домашнее задание, я постараюсь дать идею, из которой вы можете выяснить, что вам нужно делать с конструкторами копирования.

Node(const Node& copyNode) : data(copyNode.data), 
                             next(copyNode.next)
{
    // ....
}

В приведенном выше фрагменте кода вы просто делаетеnext чтобы указать местоположение, на которое указывает copyNode::next.Таким образом, вы сталкиваетесь с проблемами, когда какой-либо из указателей освобождает ресурс, на который он указывает, оставляя другой висячий .

Итак, вы должны указывать next каждый экземпляр, чтобы указатьк месту, которое он независимо держит.Итак, -

Node(const Node& copyNode) : data(copyNode.data), 
                             next(new Node)
{
    (*next) = *(copyNode.next) ;
    // ....
}  

Также прочитайте эту ветку, которая имеет превосходное объяснение - Правило трех

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...