gpt4 book ai didi

c++ - 双向链表复制构造函数和程序崩溃

转载 作者:行者123 更新时间:2023-11-30 03:54:08 27 4
gpt4 key购买 nike

我正在编写我的第一个双向链表程序,我的复制构造函数有问题。我试图在我的复制构造函数中使用一个插入函数,它获取位置和值并将值插入到列表中,但是在调用复制构造函数时,我的程序崩溃了,没有错误消息。

这是我的复制构造函数和插入函数。

Sequence::Sequence(const Sequence& other)
{
m_head=NULL;
m_numberOfItems=other.m_numberOfItems;
Node* tempNode;
int i;
for(i=0,tempNode=other.m_head;tempNode !=NULL ;tempNode=tempNode->m_next,i++)
{

insert(i,tempNode->m_data);
}
}


bool Sequence::insert(int pos, const ItemType& value)
{

if(pos<0 || pos > size())
return false;
else
{
Node* tempNode;
Node* newNode = new Node;


if(pos==size()) //This will happend if inserting 1st element or inserting at the end.
{



if(empty()==true) //in Case if there is 0 elements in the Sequence.
{
newNode->m_data=value;
newNode->m_previous=NULL;
newNode->m_next=NULL;
m_head=newNode;
m_numberOfItems++;
}
else //Inserting element at the end.
{
for(tempNode=m_head;tempNode->m_next!=NULL; tempNode=tempNode->m_next)
;

newNode->m_previous=tempNode;
newNode->m_next=NULL;
newNode->m_data=value;
tempNode->m_next=newNode;
m_numberOfItems++;
}
}


else //inserting at position 0 or somewhere in the middle.
{
tempNode=m_head;
newNode->m_data=value;

if(pos==0) //If we are inserting in 0 position of non empty sequence.
{
newNode->m_previous=NULL;
tempNode->m_previous=newNode;
newNode->m_next=tempNode;
m_head=newNode;

}
else
{
int tempPosition=0;

while(tempPosition<pos)
{
tempPosition++;
tempNode=tempNode->m_next;
}

newNode->m_next=tempNode;
newNode->m_previous=tempNode->m_previous;
tempNode->m_previous=newNode;
newNode->m_previous->m_next=newNode;
}
m_numberOfItems++;
}
return true;
}
}

谁能解释一下这里出了什么问题,以及为双向链表编写复制构造函数的最佳方法是什么?

谢谢。

最佳答案

好吧,在你的复制构造函数中,你先设置大小:

m_numberOfItems=other.m_numberOfItems;

后果:

当您insert() 时,您需要正确的大小才能做出正确的决定。所以在下面的语句中:

    if(pos==size()) //This will happend if inserting 1st element or inserting at the end.

您将立即跳转到 else block :

        ...
else //inserting at position 0 or somewhere in the middle.
{
tempNode=m_head;
...

但当您插入第一项时,m_head 仍然为 null。所以当你到达以下语句时,它会受到伤害:

           tempNode->m_previous=newNode;   /// <<<<<=== OUCH !!! 

解决方案:

m_numberOfItems 初始化为 0 并让 insert() 递增它直到它自己达到正确的值。

关于c++ - 双向链表复制构造函数和程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29736245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com