gpt4 book ai didi

c++ - 为链表创建复制构造函数

转载 作者:IT老高 更新时间:2023-10-28 21:51:33 24 4
gpt4 key购买 nike

这是作业

我正在为我的 C++ 类实现一个链表类,而复制构造函数让我非常困惑。

链表由称为 Elems 的结构组成:

struct Elem 
{
int pri;
data info;
Elem * next;
};
Elem * head;

info 是一个单独的自定义类,存储在 Elem 中。

复制构造函数的签名是:

linkedList::linkedList( const linkedList &v )

我遇到的问题主要是把我的逻辑写成代码。

我的总体思路是:

  1. 将 head 设置为 v.head (head = v.head)
  2. 将 Elem 的值设置为 v (pri = v.pri , info = v.info , next = v.next)
  3. 遍历,重复第 2 步。

这是大意吗?

任何帮助都会很棒。 记住,这是作业,所以请不要直接回答!

感谢您的宝贵时间

================================================ ==================================================== ==================================================== =================

感谢大家的宝贵时间!

我想我已经明白了:

//Copy Constructor
LinkedList::LinkedList( const LinkedList &v )
{
Elem * p1 = 0;//current
Elem * p2 = 0;//next

if( v.head == 0 )
head = 0;

else
{
head = new Elem;
head -> pri = v.head -> pri;
head -> info = v.head -> info;

p1 = head;
p2 = v.head -> next;
}

while( p2 )
{
p1 -> next = new Elem;
p1 = p1 -> next;
p1 -> pri = p2 -> pri;
p1 -> info = p2 -> info;

p2 = p2 -> next;
}
p1 -> next = 0;
}

我很确定这行得通。我画了一些合乎逻辑的图片来帮忙,我没有遇到任何问题。

最佳答案

您必须小心第 1 步和第 2 步的一部分。第 1 步应分配一个新节点并将其用作 head。在第 2 步中,关于 next = v.next 的部分,除非您的意图是进行浅拷贝,否则是不正确的。

当您复制链表等容器时,您可能需要深度复制,因此需要创建新节点并且只复制数据。新列表节点中的 nextprior 指针应该引用您为该列表创建的新节点专门,而不是来自原始 list 。这些新节点将拥有原始列表中相应数据的拷贝,因此可以将新列表视为按值复制或深层复制。

这是一张描述浅拷贝和深拷贝的区别的图片:

enter image description here

请注意,在图表的 Deep Copy 部分中,没有任何节点指向旧列表中的节点。有关浅拷贝和深拷贝之间区别的更多信息,请参阅维基百科文章 object copying。 .

关于c++ - 为链表创建复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com