为链表创建复制构造函数

Jos*_*hua 20 c++ linked-list copy-constructor

这是功课

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

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

struct Elem 
    {
        int pri;
        data info;
        Elem * next;
    };
    Elem * head;
Run Code Online (Sandbox Code Playgroud)

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

复制构造函数的签名是:

linkedList::linkedList( const linkedList &v )
Run Code Online (Sandbox Code Playgroud)

我遇到的问题主要是采用我的逻辑并实际将其编写为代码.

我的总体想法是:

  1. 设置为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;
}
Run Code Online (Sandbox Code Playgroud)

我很确定这很有效.我画了一些逻辑图片来帮助,我没有遇到任何问题.

Mic*_*eyn 22

您必须小心步骤1和步骤2的一部分.步骤1应该分配一个新节点并将其用作head.在第2步中next = v.next,除非您的意图是浅层复制,否则该部分是不正确的.

复制诸如链表之类的容器时,您可能需要深层复制,因此需要创建新节点并仅复制数据.在nextprior指针在新的列表中的节点应该是指你创建新的节点为列表,而不是节点从原来的名单.这些新节点将具有来自原始列表的相应数据的副本,以便可以将新列表视为值或深度副本.

这是描绘浅层和深层复制之间差异的图片:

在此输入图像描述

请注意,在图的深层复制部分中,没有节点指向旧列表中的节点.有关浅层和深层副本之间差异的更多信息,请参阅有关对象复制的Wikipedia文章.

  • 哦!图片!这肯定有助于澄清.+1 (3认同)