簡體   English   中英

從 C++ 的鏈表中刪除最后一個結束節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM