【问题标题】:Deep copy of linked list c++链表c++的深拷贝
【发布时间】:2012-01-10 00:49:58
【问题描述】:

我正在尝试为我制作的简单链接列表制作一个深层副本。我正在尝试了解它的基础知识,任何帮助将不胜感激。我只想获取旧列表中的第一个值并将其深度复制到新列表中。

#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;
}

该程序可以运行并且它会创建一个副本,但我只是想确保它是一个深层副本而不是浅层副本。大家觉得呢?

【问题讨论】:

    标签: visual-c++ linked-list deep-copy


    【解决方案1】:

    您将head_new 传递给deepcopy,它是NULL。然后你尝试尊重(访问)它。这会给您带来分段错误(错误),因为您不能尊重 NULL 指针。 (您无法访问任何内容,因为您的指针指向任何内容。)

    要更正您的代码,必须为main 中的head_newdeepcopy 中的每个下一个节点分配内存。你也应该继续你的new_linked_list,因为你一直分配给同一个节点。

    【讨论】:

    • 您能进一步解释一下吗?我知道这听起来可能很愚蠢,但我就是不明白。
    • @ClaudiuBadau 改进了我的答案。
    • 如何在 main 中为 head_new 分配内存?我应该删除 head_new=NULL 并用 listrec *head_new = new listrec 替换它吗?
    • @ClaudiuBadau 哦,对不起.. 这不是关于内存分配的课程。
    • 对不起。我明白。我设置了 head_new = head_old 并在我的 deepcopy 中像你建议的那样移动到我的 new_linked_list 上,它复制了我的列表,但我只是想确保这是一个深拷贝而不是浅拷贝。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多