从C+;中的链表中删除最后一个结束节点+; 我想删除C++中链表的最后一个节点。< /P>

从C+;中的链表中删除最后一个结束节点+; 我想删除C++中链表的最后一个节点。< /P>,c++,C++,我的程序有一个例外。它在一个while循环中 我怎样才能解决它?当链表有1个节点时,程序抛出异常。当链表中有超过1个节点时,该程序就会工作 引发异常:读取访问冲突。开始->下一个为空ptr。 发生 #包括 使用名称空间std; 结构节点{ int数据; 节点*下一步; }; 类链接列表{ 私人: Node*Head=NULL; Node*Tail=NULL; 节点*temp=NULL; 公众: 无效设置(整型数据) { temp=新节点; 温度->数据=数据; temp->Next=NULL;

我的程序有一个例外。它在一个while循环中

我怎样才能解决它?当链表有1个节点时,程序抛出异常。当链表中有超过1个节点时,该程序就会工作

引发异常:读取访问冲突。开始->下一个为空ptr。 发生

#包括
使用名称空间std;
结构节点{
int数据;
节点*下一步;
};
类链接列表{
私人:
Node*Head=NULL;
Node*Tail=NULL;
节点*temp=NULL;
公众:
无效设置(整型数据)
{
temp=新节点;
温度->数据=数据;
temp->Next=NULL;
if(Head==NULL)
{
压头=温度;
尾=温度;
}
其他的
{
尾部->下一步=温度;
Tail=Tail->Next;
}

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

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

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

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

您可以使用类似调试器的工具来检测导致异常的代码部分。此外,您还可以在此处阅读有关异常的更多信息:

话虽如此,您的异常发生是因为这一行:
while((开始->下一步)->Next!=NULL)
。如果列表中只有一项,
Start->Next
将为NULL,尽管尝试访问
(开始->下一步)时会出现异常->接下来
。要解决这个问题,只需检查列表中是否有多个项,然后启动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;

}
void DeleteFromEND()
{
if(Head==NULL)
{
cout Next)->Next!=NULL)
{
开始=开始->下一步;
}
温度=开始->下一步;
开始->下一步=空;
}
其他的
{
温度=启动;
Head=NULL;
}

cout您可以使用类似调试器的工具来检测导致异常的代码部分。您也可以在此处阅读有关异常的更多信息:

话虽如此,您的异常发生是因为这一行:
while((开始->下一步)->Next!=NULL)
。如果列表中只有一项,
Start->Next
将为NULL,尽管尝试访问
(开始->下一步)时会出现异常->接下来
。要解决这个问题,只需检查列表中是否有多个项,然后启动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;

}
void DeleteFromEND()
{
if(Head==NULL)
{
cout Next)->Next!=NULL)
{
开始=开始->下一步;
}
温度=开始->下一步;
开始->下一步=空;
}
其他的
{
温度=启动;
Head=NULL;
}

cout在函数中,只需检查这是否是最后一个节点

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

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

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

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

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

您可以使用调试器来解决此问题。当列表中只有一个或零个节点时会发生什么情况,其中
Head->Next
Head
是空指针?我知道这个问题。当列表中有两个、一个或零个节点时,指针应该指向不可用的节点但是我不知道如何修复它。首先,
if(Start!=nulltr)
(或者可能是
if(Start==nullptr)
,这取决于你在这种情况下想做什么)。嗯…
temp=new节点;
然后,稍后,
Delete
会释放(temp)
,而
DeleteFromEND
则执行
delete temp
free
调用是错误的。
delete
你所做的
new
你可以使用调试器来解决它。如果列表中只有一个或零个节点,其中
Head->Next
Head
是空指针,会发生什么情况?我知道这个问题。when列表中有两个、一个或零个节点,指针应该指向不存在的节点。但我不知道如何修复它。首先,
if(Start!=nulltr)
(或者可能
if(Start==nullptr)
,具体取决于您在这种情况下要执行的操作).Um…
temp=new节点;
之后,
Delete
执行
free(temp)
,而
DeleteFromEND
则执行
delete temp
free
调用错误。
delete
您的
新建了什么
,如果列表没有节点呢?@Hadi您能描述这个问题吗?我已经测试了您的代码,现在更改了这个函数,它工作正常。@Hadi当列表为空时这个函数on不应该做任何事情。我不理解这个问题。请给出一个示例代码,在这种情况下,您将面临问题。@您是否测试了代码?我尝试调用了
ls.DeleteFromEND()
紧接着
LinkedList ls;
它工作得很好。如果我不能重现您的问题,我将无能为力,这就是为什么我要求您编辑question@Hadi好的,现在它有意义了;)当列表为空时,您应该将
Head
变量设置为NULL。请参阅更新的代码。如果列表没有节点,那会怎么样?@Hadi可以告诉您吗描述问题?我已经通过更改此函数测试了您的代码,效果很好。@列表为空时,Hadi此函数不应执行任何操作。我不理解此问题。请给出一个示例代码,在这种情况下,您将面临此问题。@Hadi测试过代码吗?我尝试调用
ls.DeleteFromEND()
紧接着
LinkedList ls;
它工作得很好。如果我不能重现您的问题,我将无能为力,这就是为什么我要求您编辑question@Hadi好的,现在有意义了;)当列表为空时,您应该将
Head
变量设置为NULL。请参阅更新的代码。如果列表为em,这将生成异常