其他分享
首页 > 其他分享> > 在C中为LinkedList类创建复制构造函数时寻求帮助

在C中为LinkedList类创建复制构造函数时寻求帮助

作者:互联网

首先,我意识到StackOverflow上有很多关于此的主题.我在理解其中一些答案时遇到了一些麻烦.我正在创造这个,希望有人能帮助我理解这个过程.

如果这个问题看起来比较新手我很抱歉,但我正在尽力去理解它.

我正在学习数据结构,并被要求根据提供的标头创建LinkedList实现文件.

这是家庭作业,所以请不要’这里是确切的代码’类型的答案.我们欢迎伪代码,步骤和提示.

这是我正在处理的标题的一部分:

typedef std::string ElementType;

class LinkedList
{
private:
   class Node
   {
   public:
      ElementType data;
      Node * next;

      Node( )
      : data( ElementType( ) ), next( NULL )
      { }

      Node( ElementType initData )
      : data( initData ), next( NULL )
      { }
   }; // end of Node class

   typedef Node * NodePointer;

public:
   LinkedList( );
   /* Construct a List object

      Precondition: none.
      Postcondition: An empty List object has been constructed.
   */

   LinkedList( const LinkedList &source );
   /* Construct a copy of a List object.

      Precondition: None. 
      Postcondition: A copy of source has been constructed.
   */

   ~LinkedList( );
   /* Destroys a List object.

      Precondition:  None.
      Postcondition: Any memory allocated to the List object has been freed.
   */

   const LinkedList & operator=( const LinkedList &rightSide );
   /* Assign a copy of a List object to the current object.


private:
   NodePointer first;
   int mySize;
};

到目前为止,我已经创建了析构函数,你能检查并确保它是正确的吗?

//Destructor
LinkedList::~LinkedList() 
{ 
    NodePointer ptr = first;

    while(ptr != 0 ) {
        NodePointer next = ptr->next;
        delete ptr;
        ptr = next;
    }
    first = 0;
}

现在这里是我迷失的部分……创建复制构造函数的基本步骤是什么?我已经完成了简单的默认构造函数,但是我对复制构造函数应该做的事情有点困惑.

关于重载=运算符我也有点困惑,我认为它与复制构造函数非常相似.

编辑

我第一次尝试复制构造函数:

LinkedList::LinkedList(const LinkedList & source)
{
    //create a ptr to our copy
    Node * copy_node = source.first;
    //where we will be inserting our copy
    Node * insert_node = first;

    while(copy_node != nullptr) 
    {
        //insert our new copy node
        insert_node = new Node(copy_node->data);
        //move to our next node
        copy_node = copy_node->next;

        if(copy_node != nullptr) {
            insert_node = insert_node->next;
        } else {
            insert_node = first;
        }

        //update size
        mySize++;

    }
}

我觉得那里缺少一些东西.

解决方法:

最简单的方法是实现一个函数,它将新节点添加到列表中并在构造函数内的循环中调用它:

LinkedList(const LinkedList& rhs)
{
   Node* node = rhs.first;
   while (node) {
     add(node.data);
     node = node->next;
   }
}

void add(ElementType data)
{
   Node* node = new Node(data);
   // add node somehow
   // I'd recommend to keep pointer to the tail
}

请注意,此实现不是例外安全!

编辑:为复制构造函数添加了复制功能,这是异常安全的第一步:

LinkedList(const LinkedList& rhs)
{
  copy(rhs.first, first);
}

void copy(Node* src, Node*& dest)
{
 // handle the head element separately
 if (!src) {
   return; // empty list
 } else {
   dest = new Node(src->data); // equivalent to first = new Node...
   src = src->next;
 }

 // copy the rest of the list
 Node* p = dest; 
 while (src) {
   p->next = new Node(src->data);
   src = src->next;
   p = p->next;
 }
}

标签:c,copy-constructor,linked-list
来源: https://codeday.me/bug/20190831/1775255.html