【问题标题】:Remove Last end node from Linked List in C++从 C++ 中的链表中删除最后一个结束节点
【发布时间】: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-&gt;Next 或Head 是空指针,会发生什么情况?
  • 我知道问题所在。当列表中有两个、一个或零个节点时,指针应该指向不存在的节点。但我不知道该如何解决。
  • 首先是if (Start != nulltr)(或者可能是if (Start == nullptr),具体取决于您在这种情况下要做什么)。
  • 嗯...temp = new Node; 然后稍后,Delete 执行 free(temp),而 DeleteFromEND 执行 delete temp。 free 调用是错误的。 delete你是什么new

标签: c++


【解决方案1】:

您可以使用像GDB 这样的调试器来检测导致异常的代码部分。您还可以在此处阅读有关您的异常的更多信息:Access violation

话虽如此,您的异常发生是因为这行:while ((Start-&gt;Next)-&gt;Next != NULL)。如果您的列表中只有一项,Start-&gt;Next 将是 NULL,但在尝试访问 (Start-&gt;Next)-&gt;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;

}

【讨论】:

  • 如果列表有 no 节点?然后呢?
  • @Hadi 你能描述一下这个问题吗?我已经通过更改此功能测试了您的代码,它工作正常。
  • @Hadi 当列表为空时,此函数不应执行任何操作。我不明白这个问题。请提供一个示例代码,在这种情况下您会遇到问题。
  • @Hadi 你测试过代码吗?我尝试在LinkedList ls; 之后立即致电ls.DeleteFromEND();,效果很好。如果我无法重现您的问题,我无能为力,这就是我要求您编辑问题的原因
  • @Hadi 好的,现在这很有意义;) 当列表为空时,您应该将 Head 变量设置为 NULL。查看更新的代码。
【解决方案2】:

在您的函数 DeleteFromEND() 中,您只需要检查这是否是最后一个节点。

if(start->next == NULL){
   // write code to delete single node
}
else{
  // your remaining code
}

这样您的代码将适用于最后一个节点删除。

【讨论】:

  • 如果列表为空且start为NULL,这将产生异常
【解决方案3】:

您可以简单地使用调试器来检查导致代码出现问题的部分。顺便说一句,这是删除最后一个节点的方式。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 2013-03-25
    相关资源
    最近更新 更多