单链循环列表的复制构造函数

copy constructor for singly linked circular list

本文关键字:复制 构造函数 列表 循环 单链      更新时间:2023-10-16

我正在使用Visual Studio 2013,我想为单链循环列表创建自己的复制构造函数。这是我的构造函数代码。

CCircularList::CCircularList(CCircularList& srcList) // Copy Constructor
{
    Node* sPtr = srcList.top; // source pointer, top points to first entry in the list
    Node* dPtr = top = new Node(*sPtr); // dPtr is destination pointer, 
    sPtr = sPtr->next;
    while (sPtr != srcList.top)
    {
        dPtr->next = new Node(*sPtr);
        sPtr = sPtr->next;
        dPtr = dPtr->next;
    }
    setPosition(srcList.getPosition());
    dPtr->next = top;
}

这无法正常工作。使用复制构造函数初始化列表后,当我尝试显示它时出现此错误。

循环列表中0x011F3C99未处理的异常.exe: 0xC0000005:访问违规读取位置0x00000000。

这是 Node 类的复制构造函数。

Node::Node(Node& newNode) // Copy constructor
{
    nData = newNode.nData; // Visual studio points to this line when giving error
    next = newNode.next;
}

提前谢谢。

代码不完整。您必须首先确保CCircularList&srcList正确构造。此外,节点构造函数似乎有一些错误的想法,因为您复制了引用节点数据和下一个地址。我认为更正确的可能是一些像

Node::Node(const Node& oldNode)
: nData(oldNode.nData)
, next(nullptr)
{;}

Indeeed,该错误表明您传递的某些 sPtr 为空。你可以用断言来检查

CCircularList::CCircularList(CCircularList& srcList) // Copy Constructor
{
    Node* sPtr = srcList.top; // source pointer, top points to first entry in the list
    assert(sPtr);
    Node* dPtr = top = new Node(*sPtr); // dPtr is destination pointer, 
    sPtr = sPtr->next;
    while (sPtr != srcList.top)
    {
        assert(sPtr);
        dPtr->next = new Node(*sPtr);
        sPtr = sPtr->next;
        dPtr = dPtr->next;
    }
    setPosition(srcList.getPosition());
    dPtr->next = top;
}