从C ++的链接列表中删除最后一个节点

时间:2019-11-11 11:12:55

标签: c++

我想从C ++的链接列表中删除最后一个结束节点。

我的程序有异常。它处于while循环中。

我该如何解决?当链表具有1个节点时,程序将引发异常。当链表中的节点数超过1个时,该程序即可工作。

  

抛出异常:读取访问冲突。开始-> 下一个为nullptr。   发生

enter image description here

#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();

}

3 个答案:

答案 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;
  }