代码之家  ›  专栏  ›  技术社区  ›  DChiu28

对链表复制构造函数和赋值运算符使用copy()方法

  •  0
  • DChiu28  · 技术社区  · 7 年前

    我正在尝试为链表实现一个复制构造函数。我编写了一个复制方法,它返回一个列表,该列表将用于复制构造函数并重载赋值运算符:

    template<class T>
    SinglyList<T> SinglyList<T>::copy(Node *u) {
            SinglyList<T> newList;
            Node *current = u;
            if (current->next==NULL) {
              newList.add(current->x);
            } else while (current!=NULL) {
                newList.add(current->x);
                current = current->next;
                }
            return newList;
    }
    

    使用上面使用的add()方法:

    template<class T>
    void SinglyList<T>::add(T x) {
        Node *u = new Node(x);
        if (n == 0) {
            head = u;
        } else {
            tail->next = u;
        }
        tail = u;
        n++;
    }
    

    我一直在尝试实现复制构造函数,如下所示:

    template<class T>
    SinglyList<T>::SinglyList(const SinglyList<T> &a) {
        this->copy(a.head); //Does this not work?
    }
    

    我在main()中这样运行代码:

    int main() {
      SinglyList<int> test;
      for (int i=0; i<5; i++)
        test.add(i);
      test.print(); //This outputs 0 1 2 3 4
      SinglyList<int> test2 = test;
      test2.print(); //This should output 0 1 2 3 4 but outputs a bunch of garbage numbers
      return 0;
    }
    

    然后它崩溃了。我不完全确定问题出在哪里。它是使用复制构造函数还是使用复制方法?

    关于重载赋值运算符,使用copy方法也不起作用,但在重载中运行代码本身会起作用吗?

    template<class T>
    SinglyList<T>& SinglyList<T>::operator=(const SinglyList<T> &b) {
        //this->copy(b.head); <---This doesn't work
        Node *current = b.head;
        if (current->next==NULL) {
            this->add(current->x);
        } else while (current!=NULL) {
            this->add(current->x);
            current = current->next;
        }
        return *this;
    }
    

    班级随附代码:

    template<class T>
    class SinglyList {
    protected:
        class Node {
        public:
            T x;
            Node *next;
            Node(T x0) {
                x = x0;
                next = NULL;
            }
        };
        Node *head;
        Node *tail;
        int n;
        SinglyList<T> copy(Node*);
    public:
        SinglyList();
        SinglyList(const SinglyList<T>&);
        ~SinglyList() {
            Node *u = head;
            while (u != NULL) {
                Node *w = u;
                u = u->next;
                delete w;
            }
        };
        void add(T);
        SinglyList<T>& operator=(const SinglyList<T>&);
        void print();
    };
    

    Open Data Structures 硬件是修改代码,在现有代码中添加额外功能。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Some programmer dude    7 年前

    有几个问题,最大的是无限递归。

    您的复制构造函数调用 copy 函数,该函数按值返回一个新列表,这意味着将复制该列表并调用复制构造函数。等等等等。使用 调试器 . 我建议你花点时间 learn how to debug your programs .

    通过正确初始化成员变量,您可以使用赋值运算符(如您所示)来实现复制构造函数,如 *this = a; .

    但是,我建议您修改 复制 从其他列表复制到的函数 列表,而不是创建新列表并返回它。


    关于赋值运算符。。。当当前列表已经存在时,您必须考虑这种情况 节点,您必须先删除它们。