C написание конструктора копирования для простого связанного списка

#c #linked-list #copy-constructor

#c #связанный список #copy-constructor

Вопрос:

Пытаюсь написать простой конструктор копирования для класса связанного списка. Мой класс прост, у меня есть переменная First, которая указывает на первый узел, и переменная Last, которая указывает на последний узел.

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

Вот что у меня есть до сих пор:

 queue::queue(const queue amp;v){
    first = v.first;
    last = v.last;


    first-> value = v.first->value;

    node *curr = first;
    node *otherCur = v.first;
    while(otherCur->next != NULL){
        cout << "------Next is: " << otherCur->next->value << endl;
        curr ->next = otherCur->next;
        curr->next->value = otherCur->next->value;
        curr = curr->next;
        otherCur = otherCur->next;

    }
    curr->next = NULL;


}
  

Комментарии:

1. Все узлы во втором объекте указывают на те же узлы в первом объекте. Вам нужно выделить память для узлов второго списка и просто скопировать значения из узлов первого списка.

2. Чтобы повторить, вы копируете указатели, когда вы должны копировать указанные данные

Ответ №1:

Вы не выполнили никакого node выделения в своем коде. Фактически каждый node должен принадлежать только одному queue . Поэтому, копируя v , вы должны выделить столько node , сколько есть v .

Обратите внимание, что в следующем коде деструктор queue должен удалить все созданные узлы.

 queue::queue(const queue amp;v) : first(NULL), last(NULL) {
    if (v.first) {
        first = new node(*v.first);
        first->next = NULL;
        last = first;
        // first-> value = v.first->value; // copy constructor should have done that

        node *curr = first;
        node *otherCur = v.first;
        while(otherCur->next != NULL){
            cout << "------Next is: " << otherCur->next->value << endl;
            curr->next = new node(*otherCur->next);
            curr->next->next = NULL;
            last = curr->next;
            // curr->next->value = otherCur->next->value;
            curr = curr->next;
            otherCur = otherCur->next;
        }
        // curr->next = NULL;
    }
}