Глубокая копия связанного списка C ++ - PullRequest
1 голос
/ 30 ноября 2011

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

#include<iostream>
using namespace std;

struct listrec
{
char        value;
struct listrec    *next;
};


void deepcopy(listrec *old_linked_list,  listrec *new_linked_list)
{

while(old_linked_list != NULL)
{
    new_linked_list->value = old_linked_list->value;
    new_linked_list->next = old_linked_list->next;
    old_linked_list = old_linked_list->next;
    new_linked_list = new_linked_list->next;
}
}



int main()
{
listrec x1,x2,x3;
listrec *head_old, *head_new=NULL;

x1.value = 'a';
x1.next = &x2;

x2.value = 'c';
x2.next = &x3;

x3.value = 'w';
x3.next = NULL;

head_old = &x1;
head_new = head_old;

deepcopy(head_old, head_new);

//print old list
cout<<"Old List: "<<endl;
while(head_old != NULL)
{
    cout<<head_old->value<<endl;
    head_old= head_old->next;
}

cout<<endl;

//print copied list
cout<<"Copied list: "<<endl;
while(head_new != NULL)
{
    cout<<head_new->value<<endl;
    head_new= head_new->next;
}


system("pause");
return 0;
}

Программа работает, и она делает копию, но я просто хочу убедиться, что это глубокая копия ине мелкая копия.Что вы, ребята, думаете?

1 Ответ

1 голос
/ 30 ноября 2011

Вы передаете head_new, который равен NULL deepcopy. Затем вы пытаетесь почтить (доступ) к нему. Это дает вам ошибку сегментации (ошибка), поскольку вы не можете использовать нулевой указатель. (Вы не можете получить доступ к ничего, потому что ваш указатель указывает на ничто.)

Для исправления вашего кода необходимо выделить память для head_new в main и для каждого следующего узла в deepcopy. Также вам следует перейти на new_linked_list, так как вы все время назначаете один и тот же узел.

...