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

Doubly linked list copy constructor and program crash

本文关键字:程序 崩溃 构造函数 复制 双向链表      更新时间:2023-10-16

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

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

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 块:

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

但是m_head插入第一项时仍然为空。所以当你达到以下陈述时,它会很痛:

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

溶液:

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