我正在编写我的第一个双链表程序,我的复制构造函数存在问题。我试图在我的复制构造函数中使用insert函数,它接受位置和值并将值插入到列表中,但在调用复制构造函数时,我的程序崩溃,没有错误消息。
这是我的复制构造函数和我的插入函数。
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;
}
}
有人可以解释一下这里有什么问题吗?为双链表编写复制构造函数的最佳方法是什么?
谢谢。
答案 0 :(得分:2)
好吧,在你的拷贝构造函数中,你先设置大小:
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
仍为null。因此,当您达到以下声明时,它会受到伤害:
tempNode->m_previous=newNode; /// <<<<<=== OUCH !!!
将m_numberOfItems
初始化为0,让insert()
递增,直到它自己达到正确的值。