1

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

我正在尝试构建一个包含复制构造函数的 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::value 无法访问”。其次,我对 C++ 很陌生,而且我很确定我已经很远了。如果有人可以帮助我朝着正确的方向前进,将不胜感激。谢谢

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

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

3 回答 3

1
static ListNode *makeCopy(ListNode *pList)

应该

ListNode * LinkedList::makeCopy(ListNode *pList)

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

于 2012-08-03T04:35:46.837 回答
1

<编辑 1>您首先需要正确连接您的 makeCopy - 请参阅 Luchian 的答案以获取解释。</编辑 1>

您的第一个问题是,在 makeCopy 开始时,您将value(双精度)与 NULL(零,对于所有意图和目的)进行比较,如果它们匹配,则返回一个空指针。

我怀疑您实际上是想说,如果pList它本身是 NULL,则返回 NULL。

其次,您实际上从未在 makeCopy 中复制任何内容。在 while 循环中,您正在堆栈上创建一个新节点,但这只会在循环的每次迭代中创建/销毁。

您需要使用类似的东西创建每个节点的副本

ListNode * newNode = new Node();
newNode->value = node->value;
newNode->next = ???;

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

你需要解决的事情(我怀疑作业的真正目标,所以我不会在这里喂你),是你如何设置这个->next领域。

如果您知道列表很小,则可以考虑递归。不过,这不会是非常可扩展的。

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

<Edit 2> makeCopy 也没有返回任何东西。它需要返回一个指向头节点副本的指针(您需要记住它)。

您的 LinkedList 复制构造函数实际上也没有做任何事情。它调用 makeCopy,取消引用返回的指针,然后将其全部丢弃。你会想做类似的事情head = makeCopy(list.head)。或者更好的是,如果您已经了解了字段初始化器,那么请改用字段初始化。 /<编辑 2>*

于 2012-08-03T04:39:55.757 回答
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;
}
于 2012-08-03T05:02:57.130 回答