Скопируйте конструктор обхода через связанный список. реализация

0

Я пытаюсь скопировать весь связанный список в свой конструктор копирования, однако я продолжаю получать доступ. Почему моя копия не работает правильно? ошибки:

Unhandled exception at 0x00AE506C in program.exe: 0xC0000005: Access violation reading location 0x00000004.

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

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

    int size;
    size = list.GetSize();

    for (int i = 1; i <= size; i++)
    {
        tmp->data= list.RetrieveNode(i).data;
        tmp->next = list.RetrieveNode(i).next;
        tmp = tmp->next;
    }
}

в основном

NodeSLList list2 (list1);
cout << "cout << list2 " << endl;
cout << list2 << endl;

Ошибка возникает в cout << list2 << endl; поскольку конструктор кода неправильно скопировал связанный список.

  • 1
    Есть ли причина, почему вы начинаете свои петли с 1 ? В C ++ первый элемент (обычно) 0 . Кроме того, у вас есть функция, которая добавляет узел в конец списка? Если это так, то конструктор копирования намного проще, чем тот, который вы написали.
  • 0
    способ, которым я установил связанный список, является 1 к N
Показать ещё 1 комментарий
Теги:
pointers
linked-list
constructor
copy-constructor

1 ответ

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

Одна из проблем заключается в следующем:

head = list.head;
IntNode *tmp = head;

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

Если у вас есть функция, которая добавляет узел в ваш связанный список, вы можете использовать его в конструкторе копирования, чтобы этого избежать. Вот пример:

NodeSLList::NodeSLList(const NodeSLList & list) : head(0)
{
    int size;
    size = list.GetSize();
    for (int i = 1; i <= size; i++)
        addData(list.RetrieveNode(i).data);
}

Это требует, чтобы у вас была функция, похожая на addData которая добавляет новый узел, используя данные, переданные в. Обратите внимание, что это проверяет вашу функцию addData чтобы убедиться, что она работает правильно. Конструктор копирования просто вызывает его в цикле.

Наконец, вам также нужен оператор присваивания, чтобы идти вместе с конструктором копирования (а также деструктором). Оператор присваивания может быть записан с использованием конструктора копирования и деструктора в качестве вспомогательных функций (т. copy/swap Идиомы copy/swap).

Ещё вопросы

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