C++ 双链表复制构造函数与程序崩溃

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;

我正在编写我的第一个双链表程序,我的复制构造函数有一个问题。我试图在复制构造函数中使用一个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;
    }
}
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节点,它们会删除所有特殊情况。请参阅