我当前任务的这一部分让我完全难过:
我正在尝试构建一个包含复制构造函数的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;
}
答案 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;
}