Копирование связанного списка в ссылку на связанный список - PullRequest
0 голосов
/ 06 мая 2019

Мне было поручено передать указатель на связанный список и скопировать его в новый список, переданный как указатель на связанный список, и рекурсивно скопировать его. Я получаю ошибку сегментации при попытке скопировать самый первый элемент.

Я пробовал каждую комбинацию указателя и ссылки, о которой я мог подумать, поддерживая программные требования прототипа функции: void duplicate (node ​​* head, node * & newHead)

 #include <iostream>
 #include "supplied.o"

 using namespace std;

 struct node
 {
     int data;
     node * next;
 };

 int main()
 {
     node * head = NULL;
     build(head);  // supplied function initializes list
     newHead = NULL;
     duplicate (head, newHead);
 }

 void duplicate (node * head, node*& newHead)
 {
     node * iterator1  = NULL;
     node * iterator2 = new Node;
     node * iterator2 = newHead;
     iterator2->data = iterator1->data; //error occurs here
     // program will continue to copy list recursively
 }

 void build (node *& head) //cannot see this function; provided via "supplied.o"
 {
 }

ошибка возникает из-за того, что функция не может получить доступ к iterator2-> data. Итератор1-> данные могут быть доступны и даже напечатаны без проблем.

1 Ответ

2 голосов
/ 06 мая 2019

Просто создайте новый узел, затем скопируйте данные, а затем выполните рекурсию с next узлами.Берегите нулевые указатели.Вот и все.

duplicate(const node*head, node* &newhead)
{
    if(head) {
        // copy a valid node
        newhead = new node;                   // allocate a new node
        newhead->data = head->data;           // copy the data
        duplicate(head->next, newhead->next); // recurse on the next node
    } else
        // in case of null pointer: terminate recursion
        newhead = nullptr;
}

Теперь рассмотрим, что происходит шаг за шагом, если вы позвоните по номеру duplicate с длинным списком и убедите себя, что он действительно делает то, что вы хотите.

...