双链表复制构造函数和程序崩溃

时间:2015-04-19 21:42:13

标签: c++ linked-list

我正在编写我的第一个双链表程序,我的复制构造函数存在问题。我试图在我的复制构造函数中使用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;
    }
}

有人可以解释一下这里有什么问题吗?为双链表编写复制构造函数的最佳方法是什么?

谢谢。

1 个答案:

答案 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()递增,直到它自己达到正确的值。