c ++ - 单链接循环列表的复制构造函数

时间:2015-04-11 05:12:14

标签: c++

我正在使用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;

}

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

循环List.exe中0x011F3C99处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

Indeeed,该错误表明您传递的某些sPtr为null。你可以查看断言做

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