我正在编写一个复制构造函数,例如将S复制到R;设R(S);. S是一个包含一些整数的排序单链表(在开头有一个虚拟节点)。
Set::Set (const Set &source)
{
Node* sourceNode = source.head->next;
head = new Node(0, nullptr);
Node* nodeHead = source.head->next;
Node* p;
if (!sourceNode) {
std::cout << "Empty !" << endl;
}
else{
while (nodeHead) {
for (p=sourceNode; p->next; p=p->next) {
;
}
head->next = new Node(nodeHead->value,nullptr);
head = head->next;
nodeHead = nodeHead->next;
}
}
}
现在它崩溃了,如果我删除head = head-&gt; next;它会将S设置为{5}。
这是构造函数:
class Node
{
public:
Node (int, Node*);
private:
int value;
Node* next;
};
为什么这不起作用?这是我第一次使用指针的经验,请记住这一点。
答案 0 :(得分:1)
假设您有一个添加到链表末尾的函数。在这种情况下,复制构造函数非常简单:
Set::Set (const Set &source) : head(0)
{
Node* sourceNode = source.head;
while (sourceNode != NULL )
{
addToList(sourceNode->value);
sourceNode = sourceNode->next;
}
}
addToList
是将节点添加到列表背面的功能。所有复制构造函数都要从空列表开始,然后在循环中添加source
列表中的项目,直到source
列表中的项目数用尽。在正确编码addToList
函数的情况下,此方法可以保证正常工作,并避免代码重复。
这是实现复制构造函数的最简单方法。如果你没有添加到列表背面的功能,现在是添加它的好时机,因为你需要在任何情况下都有这样的功能。