链接列表复制构造函数和赋值操作符

linkList copy constructor and assignment operator

本文关键字:赋值操作符 构造函数 复制 列表 链接      更新时间:2023-10-16

我正在编写我的节点和列表类,除了在列表类中包含析构函数,复制构造函数和赋值操作符函数外,一切都很好,我不知道它们有什么问题,也不知道我错过了什么。

linklist::linklist()
    :firstNode(NULL),
    lastNode(NULL),
    nodeCount(0) {}
linklist::~linklist()// destructor
{
    node* current = firstNode;
    while( current != 0 ) {
        node* temp = current->getNextNode();
        delete current;
        current = temp;
    }
    firstNode = 0;
}
linklist::linklist(linklist &L)// copy constructor
{
    firstNode = NULL;
    nodeCount = 0;
    node* temp = L.firstNode;
    for(int i = 0; i < L.getNodeCount(); i++)
    {
        push_back(temp);
        temp = temp->getNextNode();
    }
}
linklist& linklist::operator=(const linklist& L)// overloading assignemnt operator
{
    linklist* LL;
    node* temp = L.firstNode;
    while( temp != NULL ) {
        LL->getLast();
        temp = temp -> getNextNode();
    }
    return *LL;
}

您的赋值应该类似于您的复制构造函数。因为它们的作用几乎是一样的。

区别在于你的分配应该 clear 在开始复制rhs(另一个)之前在列表(本身)中。

然后它应该返回对自身的引用。return *this。这样赋值就可以链接了。

linklist& linklist::operator=(const linklist& L)// overloading assignemnt operator
{
    // Check if self assignment
    if (&L == this)
       return *this;
    // clear myself.
    // copy other.
    return *this;
}

你似乎有两个问题。首先,析构函数删除所有节点结构。一旦原始链表被销毁,使用复制构造函数复制的任何新链表都会有不正确的数据。其次,使用复制构造函数复制节点结构可能会更好。在没有确切信息的情况下很难说,但是您的链表函数可能看起来像:

firstNode = NULL;
nodeCount = 0;
node* temp = L.firstNode;
for(int i = 0; i < L.getNodeCount(); i++)
{
    push_back(new node(*temp));
    temp = temp->getNextNode();
}

这样新的链表就有了自己的节点副本。