[英]Remove Last end node from Linked List in C++
我想從 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();
}
您可以使用GDB之類的調試器來檢測導致異常的代碼部分。 您還可以在此處閱讀有關您的異常的更多信息: 訪問沖突
話雖如此,您的異常發生是因為這一行: 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;
}
在您的 function DeleteFromEND()中,您只需要檢查這是否是最后一個節點。
if(start->next == NULL){
// write code to delete single node
}
else{
// your remaining code
}
這樣,您的代碼將適用於最后一個節點刪除。
您可以簡單地使用調試器來檢查哪個部分導致代碼出現問題。 順便說一句,這是刪除最后一個節點的方式。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.