在单链接列表中复制构造函数和赋值运算符

时间:2014-02-02 02:37:05

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

这是我昨天就单独链接列表分配的问题的后续跟进。我一直在努力创建复制构造函数,将赋值运算符留到最后,因为我认为它们与实现有些相似。我想我已经完成了创建复制构造函数的步骤:

  1. 使用新列表作为参数创建一个新节点。
  2. 遍历列表,将每个节点从list1添加到list2(我有一个添加功能,我认为这对此有帮助吗?)
  3. 在执行此操作时递增list2,以便正确添加每个节点。
  4. 请在任何步骤上纠正我(或者我需要扩展步骤)。我已经查看了很多在Google上发现的代码,试图理解我必须做的事情,但我的实现和理解仍然必须模糊。这是我的代码(未注释的代码是我的最后一次尝试。评论的代码是我之前尝试过的,希望到目前为止我至少在正确的轨道上):

    template<typename T>
    SLList<T>::SLList(const SLList<T> & lst2) : head() {
        cout << "Calling copy constructor..." << endl;
        for (Node *ptr = lst2.head; ptr != NULL; ptr = ptr->next) {
            add(ptr->data);
        }
    }
    

    编辑:感谢WhozCraig帮助我使用上面的复制构造函数。

    以下是add函数,以防万一可以使用:

    template<typename T>
    void SLList<T>::add(const T& val) {
        Node *prev = head; 
        for (Node *ptr = head->next; ptr != NULL; ptr = ptr->next) {
            prev = ptr;
            if (ptr->data == val) {
                return;
            }
        }
        prev->next = new Node(val);
    }
    

    我的想法可能不对,但是我在lst2.add(ptr->data);的第一个代码段的第5行会调用add函数,只需用{{ptr->data替换val 1}?只是想知道写这样的行是否会带来任何错误。

    编辑:我也忘了发布此代码段。它向我展示了创建两个整数列表并尝试生成iList2 = iList;以便调用复制构造函数。不过,我想我可能做错了。

    void intList() {
        SLList<int> iList;
        cout << "\nNow showing integer list..." << endl;
        iList.add(5);
        iList.add(6);
        iList.add(6);
        iList.add(3);
        iList.add(4);
        SLList<int> iList2 = iList;
        iList.print();
        iList2.print();
    }
    

    编辑2:复制构造函数问题已在上面修复,但现在调用add函数时,它会在for循环中崩溃。可能是因为lst2const个对象且add不是const函数,正如WhozCraig所说的那样?

    编辑3:我尝试使用赋值运算符,以防万一:

    template<typename T>
    const SLList<T>& SLList<T>::operator=(const SLList & rhs) {
        cout << "\nCalling assignment operator..." << endl;
        // Step (1) Delete the existing list
        while (head != NULL) {
            Node *temp = head;
            head = head->next;
            delete temp;
        }
        // Step (2) Build a new, copy list
        if (this != &rhs) {
            for (const Node *ptr = rhs.head; ptr != NULL; ptr = ptr->next) {
                add(ptr->data);
            }
        }
        return *this;
    }
    

0 个答案:

没有答案