用单链表编写复制构造函数?

时间:2014-11-27 16:23:48

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

我正在编写一个复制构造函数,例如将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;
};

为什么这不起作用?这是我第一次使用指针的经验,请记住这一点。

1 个答案:

答案 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函数的情况下,此方法可以保证正常工作,并避免代码重复。

这是实现复制构造函数的最简单方法。如果你没有添加到列表背面的功能,现在是添加它的好时机,因为你需要在任何情况下都有这样的功能。