Возникли проблемы при реализации конструктора копирования для двусвязного списка - PullRequest
2 голосов
/ 25 сентября 2019

Я изо всех сил пытаюсь реализовать конструктор копирования для двусвязного списка.Программа компилируется, но я сталкиваюсь с проблемой использования функции «push_back» в конструкторе копирования для добавления вновь созданных узлов в список.Ниже обсуждаются конструктор копирования и функции push_back.

List::List(const List& rhs) // Copy constructor
{
    //this pointer is for the list that is being copied from
    Node* rhsNodePtr;

    //setting the new pointer to the first node of the old list
    rhsNodePtr = rhs.first;

    //looping until the end of the list
    while(rhsNodePtr != nullptr){

        //declaring new node to copy data into
        Node* newNode = new Node("");

        //copying node data from original list into new node
        newNode->data = rhsNodePtr->data;

        //adding new copied node to a new list
        push_back(newNode->data);

        //advancing the old list pointer location for the loop
        rhsNodePtr = rhsNodePtr->next;
    }
}

void List::push_back(string element)
{ 
   Node* new_node = new Node(element);
   if (last == nullptr) // List is empty
   {  
      first = new_node;
      last = new_node;
   }
   else
   {  
      new_node->previous = last;
      last->next = new_node;
      last = new_node;
   }
}

Я приношу свои извинения, если пропустил какие-либо соответствующие подробности.Обратите внимание, что я не просто ищу решение или исправление, но объясняю, почему push_back ();функция не работает в моей текущей реализации.

Редактирование: цикл while в конструкторе копирования застревает после вызова функции push_back.

Edit: «First» и «last» инициализируются в объявлении класса List, и оба значения равны «nullptr» в конструкторе.

Edit: После запуска через отладчик я узнал, чтов функции push_back в строке last->next = new_node;

имеется недопустимый доступ к памяти (ошибка сегментации)

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Вы не инициализируете last в конструкторе копирования.Так что push_back вызывается с мусором.

Кстати, я не вижу необходимости в newNode, и вы не освобождаете его.Вы можете просто push_back(rhsNodePtr->data); напрямую.

1 голос
/ 25 сентября 2019

Ваш конструктор копирования не инициализирует first и last (кроме случаев, когда вы делаете это в объявлении класса, которое вы не показывали), и он также пропускает Node на каждой итерации цикла.

Попробуйте вместо этого:

List::List(const List& rhs)
    : first(nullptr), last(nullptr) // <-- add this if needed
{
    Node* rhsNodePtr = rhs.first;
    while (rhsNodePtr) {
        push_back(rhsNodePtr->data); // <-- no need to allocate a new Node for this call
        rhsNodePtr = rhsNodePtr->next;
    }
}

void List::push_back(string element)
{ 
   Node* new_node = new Node(element);
   new_node->previous = last;
   new_node->next = nullptr; // <-- add this if needed
   if (!first) first = new_node;
   if (last) last->next = new_node;
   last = new_node;
}
...