我想从C ++的链接列表中删除最后一个结束节点。
我的程序有异常。它处于while循环中。
我该如何解决?当链表具有1个节点时,程序将引发异常。当链表中的节点数超过1个时,该程序即可工作。
抛出异常:读取访问冲突。开始-> 下一个为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();
}
答案 0 :(得分:1)
您可以使用GDB之类的调试器来检测导致异常的代码部分。另外,您还可以在这里阅读有关您的异常的更多信息:Access violation
话虽如此,您的例外正在发生,因为以下行:while ((Start->Next)->Next != NULL)
。如果列表中只有一项,则Start->Next
将为 NULL ,尽管尝试访问(Start->Next)->Next
时会遇到异常。要解决此问题,只需检查列表中是否包含多个项目,然后启动while循环。
void DeleteFromEND()
{
if(Head == NULL)
{
cout << " There is no item to delete!" << endl;
return;
}
Node* Start = Head;
if(Start->Next != NULL)
{
while ((Start->Next)->Next != NULL)
{
Start = Start->Next;
}
temp = Start->Next;
Start->Next = NULL;
}
else
{
temp = Start;
Head = NULL;
}
cout << " Deleted Item From END: " << temp->Data << endl;
delete temp;
}
答案 1 :(得分:1)
在函数 DeleteFromEND()中,您只需要检查这是否是最后一个节点即可。
super().__init__()
这样,您的代码将可用于最后一个节点删除。
答案 2 :(得分:0)
您可以简单地使用调试器来检查哪个部分导致了代码问题。顺便说一句,这就是删除最后一个节点的方式。
struct node* delete_last(struct node* head)
{ int i;
if(head == NULL){ // if list is empty.
return head;
}
if(haed->next->next == NULL){ // if list has only 1 element.
free(head);
return head;
}
struct node* temp1 = head;
while(temp1->next->next!=NULL)
{ temp1 = temp1->next; }
struct node* temp2 = temp1->next;
temp1->next=temp2->next;
free(temp2);
return head;
}