2016-10-09 4 views
3

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

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

Вот что я до сих пор:

queue::queue(const queue &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; 


} 
+2

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

+0

Чтобы повторить, вы копируете указатели, когда вы должны копировать данные, указывающие на данные – qxz

ответ

0

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

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

queue::queue(const queue &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; 
    } 
} 
Смежные вопросы