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

0

Я пытаюсь реализовать связанный список с определенными методами, которые дополняют связанный список. Однако, как только я скопирую связанный список и удалю заголовок первого связанного списка и реализую мой перегруженный оператор "<<" для вывода связанного списка, я получаю сообщение об ошибке

Unhandled exception at 0x0128506C in program.exe: 0xC0000005: Access violation reading location 0xFEEEFEF2.

Как скопировать связанный список, в зависимости от первого связанного списка.

NodeSLList list2 (list1); //copy constructor 
temp = list1.DeleteFromHead();
cout << "node retrieved " << temp.data << endl;
cout << "cout << list1 " << endl;
cout << list1 << endl;
cout << list2 << endl; //error occurs 

копировать конструктор

NodeSLList::NodeSLList(NodeSLList & list)
{
    head = list.head;
    tail = list.tail; 
    cout << "copy constructor called" << endl;

}
  • 4
    Предполагается, что конструктор копирования связанного списка создает копию связанного списка. Простое копирование значений указателя не делает этого. Вам нужно воссоздать весь связанный список с нуля в копии.
Теги:
pointers
linked-list
constructor
copy-constructor

2 ответа

2
Лучший ответ

Конструктор копирования не копирует. Он только заставляет новый список указывать на первый и последний узлы вашего исходного списка.

В основном вам нужен цикл, перемещающий каждый узел вашего исходного списка и вызывающий конструктор копирования для каждого из них, который связывает соседние копии вместе.

Node* n=list.head;
Node* prv=0;
while (n)
{
    Node* cpy = new Node(*n);
    if (prv)
        prv->next=cpy;
    else
        head=cpy;

    n=n->next;
    prv=cpy;
}
tail=prv;
1

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

Если у вас есть функция "push", "add" или "insert", которую вы используете для нажатия элементов в список, используйте эту функцию для воссоздания списка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню