【发布时间】:2019-11-11 21:44:45
【问题描述】:
我想从 C++ 中的链表中删除最后一个结束节点。
我的程序有异常。它在一个while循环中。
我该如何解决?当链表有 1 个节点时,程序抛出异常。当我们在链表中有超过 1 个节点时,该程序可以工作。
抛出异常:读取访问冲突。 Start->Next 是 nullptr。 发生了
#include <iostream>
using namespace std;
struct Node {
int Data;
Node* Next;
};
class LinkedList {
private:
Node* Head = NULL;
Node* Tail = NULL;
Node* temp = NULL;
public:
void Setup(int Data)
{
temp = new Node;
temp->Data = Data;
temp->Next = NULL;
if (Head == NULL)
{
Head = temp;
Tail = temp;
}
else
{
Tail->Next = temp;
Tail = Tail->Next;
}
cout << "Insert : " << Data << endl;
//temp = NULL;
}
void Delete()
{
if (Head != NULL)
{
temp = Head;
Head = Head->Next;
cout << " Deleted Item is: " << temp->Data << endl;
delete temp;
}
else
{
cout << " List is Empty \n";
}
}
void DeleteFromEND()
{
Node* Start = Head;
if (Start == NULL)
{
cout << " There is no item to delete!" << endl;
return;
}
if (Start->Next != NULL)
{
while ((Start->Next)->Next != NULL)
{
Start = Start->Next;
}
temp = Start->Next;
Start->Next = NULL;
}
else
{
temp = Start;
}
cout << " Deleted Item From END: " << temp->Data << endl;
delete temp;
}
};
int main()
{
LinkedList ls;
ls.Setup(15);
ls.Setup(1);
ls.Setup(5);
ls.Setup(9);
ls.DeleteFromEND();
ls.DeleteFromEND(); ls.DeleteFromEND(); ls.DeleteFromEND();
ls.DeleteFromEND();
ls.DeleteFromEND();
ls.Setup(4);
ls.Setup(545);
//ls.Delete();
ls.Setup(0);
ls.Setup(-19);
ls.DeleteFromEND();
ls.DeleteFromEND();
ls.DeleteFromEND();
ls.DeleteFromEND();
ls.DeleteFromEND();
ls.DeleteFromEND();
ls.DeleteFromEND();
ls.DeleteFromEND();
}
【问题讨论】:
-
可以使用调试器解决。
-
如果列表中只有一个或零个节点,而
Head->Next或Head是空指针,会发生什么情况? -
我知道问题所在。当列表中有两个、一个或零个节点时,指针应该指向不存在的节点。但我不知道该如何解决。
-
首先是
if (Start != nulltr)(或者可能是if (Start == nullptr),具体取决于您在这种情况下要做什么)。 -
嗯...
temp = new Node;然后稍后,Delete执行free(temp),而DeleteFromEND执行delete temp。free调用是错误的。delete你是什么new
标签: c++