使用链接列表创建复制构造函数

时间:2012-08-03 04:26:34

标签: c++ linked-list copy-constructor

我当前任务的这一部分让我完全难过:

我正在尝试构建一个包含复制构造函数的LinkedList类,该构造函数本身调用静态方法(* makeCopy())。我无法弄清楚如何使makeCopy方法工作(所有方法标题都在赋值中给我们)。

class ListNode
{
public:
    ListNode(double v, ListNode *p)
{
   value = v; 
   next = p;
}
private:    
   double value;
   ListNode *next;
   friend class LinkedList;    // LinkedList  has friend status 
};

// The linked list class itself
class LinkedList
{
public:
//Add number to Linked List
void add(double x)
{
    if (head == NULL)
    {
        head = new ListNode(x, NULL);
        return;
    }
    else
    {
        ListNode *nodePtr = head;
        head = new ListNode(x, nodePtr);
    }

}
LinkedList() { head = NULL; }

//Default destructor
~LinkedList()
{
    ListNode *nodePtr = head;
    while (nodePtr != NULL)
    {
        ListNode *garbage = nodePtr;
        nodePtr = nodePtr->next;
        delete garbage;
    }
}

//Copy Constructor
LinkedList(LinkedList &);

//Copy function
static ListNode *makeCopy(ListNode *pList);

private:
   ListNode * head;    

};

以下是我尝试编写makeCopy函数的方法:

LinkedList::LinkedList(LinkedList &list)
{
    *makeCopy(list.head);
}

static ListNode *makeCopy(ListNode *pList)
{
   if(pList->value == NULL)
   {        
       return NULL;
   }
   else
   {
    ListNode *node = pList;

    while(node != NULL)
    {
        ListNode newOne = *node;
        node = node->next;
    }
}

return;
}

首先我继续得到错误“成员ListNode ::值是无法接受的”。其次我对C ++很新,很确定我已经离开了。如果有人能帮助我朝着正确的方向推动我,我将不胜感激。 THX

这是我当前复制构造函数和makeCopy方法的迭代。不幸的是,ListNode构造函数以及所有方法头都是赋值的一部分。我们必须为它们编写代码。我现在得到的错误是:两个返回语句都说“错误:构造函数或析构函数可能不返回值”。我完全迷失了这个,因为这只是一个return语句,我没有看到构造函数或析构函数。

LinkedList::LinkedList(LinkedList &list)
{
    LinkedList *copy = new LinkedList();

    while(list.head != NULL)
    {
        ListNode node = *makeCopy(list.head);
        copy->add(node.value);
        list.head = head->next;
    }

    return *copy;
 }

 ListNode * LinkedList::makeCopy(ListNode *pList)
 {
    ListNode node = *pList;

    return *node;
 }

3 个答案:

答案 0 :(得分:1)

static ListNode *makeCopy(ListNode *pList)

应该是

ListNode * LinkedList::makeCopy(ListNode *pList)

您的版本定义了具有内部链接的自由函数,而不是定义成员。

答案 1 :(得分:1)

<编辑1> 您首先需要将您的makeCopy链接正确 - 请参阅Luchian的答案以解释该问题。 < /编辑1>

你的第一个问题是,在makeCopy的开头,你将value(一个double)与NULL(零,对于所有意图和目的)进行比较,并在它们匹配时返回一个空指针。 / p>

我怀疑你的意思是,如果pList本身为NULL,则返回NULL。

其次,你实际上从来没有在makeCopy中复制任何东西。在while循环中,您将在堆栈上创建一个新节点,但这将在循环的每次迭代中创建/销毁。

您需要使用

之类的内容创建每个节点的副本
ListNode * newNode = new Node();
newNode->value = node->value;
newNode->next = ???;

注意使用new来创建新元素。

你需要解决的问题(我怀疑家庭作业的真正目标,所以我不会在这里给你喂食),你是如何设置->next字段的。

如果您知道列表很小,则可以考虑递归。但这不会很有可扩展性。

否则,您需要找到一种在之后设置下一个指针的方法你复制了下一个元素(这是更好的方法)。

<编辑2> makeCopy也没有返回任何内容。它需要返回一个指向头节点副本的指针(你需要记住它)。

您的LinkedList拷贝构造函数实际上也没有做任何事情。它调用makeCopy,取消引用返回的指针,然后将其抛弃。你会想做head = makeCopy(list.head)之类的事情。或者甚至更好,如果您已经了解了字段初始化程序,那么请使用字段初始化。 /<编辑2> *

答案 2 :(得分:0)

如果我正确理解你的配置“makeCopy”需要一个指向链接节点列表的指针,并且必须创建这个链表的副本并返回指向第一个元素的指针,对吗?

以下是我认为需要做的事情:

LinkedList::LinkedList(LinkedList &list)
    : head(makeCopy(list.head))
{
}

ListNode* LinkedList::makeCopy(ListNode *pList)
{
   if (!pList)
   {
       return 0;
   }

   ListNode* head = new ListNode(plist->value, 0);
   ListNode* back = head;
   plist = plist->next;

   while (pList)
   {
       ListNode* newNode = new ListNode(plist->value, 0);
       back->next = newNode;
       back = newNode;
       plist = plist->next;
   }

   return head;
}