双向链表复制构造函数和程序崩溃
Doubly linked list copy constructor and program crash
我正在编写我的第一个双向链表程序,我的复制构造函数有问题。我正在尝试在我的复制构造函数中使用插入函数,该函数获取位置和值并将值插入到列表中,但是在调用复制构造函数时,我的程序崩溃,没有错误消息。
这是我的复制构造函数和插入函数。
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()
直到它自己达到正确的值。
相关文章:
- 程序崩溃并显示"std::out_of_range"错误
- 试图创建流或fopen时程序崩溃
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- DLL Made with CMake 使程序崩溃
- 程序崩溃使用boost::asio
- 调用 free() 有时会导致程序崩溃
- 邮件加密程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- For 循环在尝试读取数组 c++ 时程序崩溃
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 无法访问的代码如何导致我的程序崩溃?
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- QCompleter set模型使应用程序崩溃
- 使用唯一指针调用函数会使我的程序崩溃
- 删除SDL_PollEvent时程序崩溃