C++ 双链表复制构造函数与程序崩溃
我正在编写我的第一个双链表程序,我的复制构造函数有一个问题。我试图在复制构造函数中使用一个insert函数,它获取位置和值并将值插入列表中,但是调用复制构造函数时,我的程序崩溃,没有错误消息 这是我的复制构造函数和插入函数C++ 双链表复制构造函数与程序崩溃,c++,linked-list,C++,Linked List,我正在编写我的第一个双链表程序,我的复制构造函数有一个问题。我试图在复制构造函数中使用一个insert函数,它获取位置和值并将值插入列表中,但是调用复制构造函数时,我的程序崩溃,没有错误消息 这是我的复制构造函数和插入函数 Sequence::Sequence(const Sequence& other) { m_head=NULL; m_numberOfItems=other.m_numberOfItems; Node* tempNode; int i;
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;
}
}
Sequence::Sequence(常量序列和其他)
{
m_头=空;
m_numberOfItems=其他.m_numberOfItems;
节点*临时节点;
int i;
对于(i=0,tempNode=other.m_head;tempNode!=NULL;tempNode=tempNode->m_next,i++)
{
插入(i,tempNode->m_数据);
}
}
布尔序列::插入(int pos、const ItemType和value)
{
if(pos size())
返回false;
其他的
{
节点*临时节点;
Node*newNode=新节点;
if(pos==size())//如果插入第一个元素或在末尾插入,则会发生这种情况。
{
if(empty()==true)//如果序列中有0个元素,则为Case。
{
新建节点->m_数据=值;
newNode->m_previous=NULL;
newNode->m_next=NULL;
m_头=新节点;
m_numberOfItems++;
}
else//在末尾插入元素。
{
对于(tempNode=m_head;tempNode->m_next!=NULL;tempNode=tempNode->m_next)
;
newNode->m_previous=tempNode;
newNode->m_next=NULL;
新建节点->m_数据=值;
tempNode->m_next=newNode;
m_numberOfItems++;
}
}
否则,插入位置0或中间的某个位置。
{
tempNode=m_头;
新建节点->m_数据=值;
if(pos==0)//如果我们在非空序列的0位置插入。
{
newNode->m_previous=NULL;
tempNode->m_previous=newNode;
newNode->m_next=tempNode;
m_头=新节点;
}
其他的
{
int tempPosition=0;
while(temp)m_next;
}
newNode->m_next=tempNode;
newNode->m_previous=tempNode->m_previous;
tempNode->m_previous=newNode;
newNode->m_previous->m_next=newNode;
}
m_numberOfItems++;
}
返回true;
}
}
有人能解释一下这里的错误吗?写双链表副本构造函数的最佳方法是什么
谢谢。好吧,在复制构造函数中,您先设置大小,然后再进行其他操作:
m_numberOfItems=other.m_numberOfItems;
后果:
当您insert()
时,您需要正确的大小才能做出正确的决定。因此,在下面的语句中:
if(pos==size()) //This will happend if inserting 1st element or inserting at the end.
您将立即跳转到else块:
...
else //inserting at position 0 or somewhere in the middle.
{
tempNode=m_head;
...
但是插入第一项时,m_head
仍然为空。因此,当您达到以下语句时,它会造成伤害:
tempNode->m_previous=newNode; /// <<<<<=== OUCH !!!
tempNode->m_previous=newNode;///哦,天哪,这是一个多么愚蠢的错误,非常感谢你指出了这一点。起初我打算采用一种不同的方法,但后来我忘了改变它。它奏效了,谢谢。我真的建议对链接列表使用sentry节点,它们会删除所有特殊情况。请参阅