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

时间:2017-11-11 05:35:28

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

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

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;
}

然后它崩溃了。我不完全确定问题是什么。它是复制构造函数还是复制方法?

关于重载赋值运算符,使用复制方法不起作用,但在重载中运行代码本身有效吗?

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解除,而HW则修改代码以向现有代码添加额外功能。

1 个答案:

答案 0 :(得分:0)

有一些问题,最大的问题是无限递归。

您的copy-constructor调用copy函数,该函数按值返回一个新列表,这意味着它将被复制并且将调用copy-constructor。等等等等。使用调试程序可以轻松检测到此问题。我建议你花一些时间来enter image description here

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

但是,我建议您修改copy函数以将其他列表复制到列表中,而不是创建新列表并将其返回。

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