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