C 循环链表中的Delete函数在只剩下一个节点时将next和previous更改为null

C 循环链表中的Delete函数在只剩下一个节点时将next和previous更改为null,c,linked-list,nodes,C,Linked List,Nodes,在循环双链接列表的删除函数中,当我输入带有两个节点的函数并删除一个节点时,它将我的下一个节点和上一个节点更改为null。只有当我在链表中输入带有两个节点的函数时,才会发生这种情况。我在eclipse中使用断点,在我结束函数并返回temp之前,一切似乎都在工作。之后,ptrLocal的下一个和上一个设置为NULL。不太清楚为什么 下面是函数调用 struct TCB_t del = delete_from_list(&RunQ); 下面是函数 struct TCB_t delete_fr

在循环双链接列表的删除函数中,当我输入带有两个节点的函数并删除一个节点时,它将我的下一个节点和上一个节点更改为null。只有当我在链表中输入带有两个节点的函数时,才会发生这种情况。我在eclipse中使用断点,在我结束函数并返回temp之前,一切似乎都在工作。之后,ptrLocal的下一个和上一个设置为NULL。不太清楚为什么

下面是函数调用

struct TCB_t del = delete_from_list(&RunQ);
下面是函数

struct TCB_t delete_from_list(struct  TCB_t **ptrLocal)
{
    struct TCB_t temp;

    if(*ptrLocal)
    {

        temp = **ptrLocal;
        temp.next = NULL;
        temp.previous =NULL;

        if(*ptrLocal == (*ptrLocal)->next->next)
        {
            *ptrLocal = (*ptrLocal)->next;
            (*ptrLocal)->next = *ptrLocal;
            (*ptrLocal)->previous =  *ptrLocal;
        }
        else if(*ptrLocal != (*ptrLocal)->next)
        {
            (*ptrLocal)->previous->next = (*ptrLocal)->next;
            (*ptrLocal)->next->previous = (*ptrLocal)->previous;
            *ptrLocal = (*ptrLocal)->next;
        }
        else
        {
            (*ptrLocal)->previous = NULL;
            (*ptrLocal)->next = NULL;
            *ptrLocal =NULL;
        }
        count--;
    }
    return temp;
}

返回temp ptrLocal->next和preLocal->previous后都设置为null。

您的错误是最后一个错误。当列表中只有一个节点时应用此选项

在循环链表中,“下一个”和“上一个”永远不应为空

因此,如果只有1项,则“下一项”和“上一项”应指向自身

现在,您应该这样检查:

if ((*ptrLocal)->next = (*ptrLocal)){ //delete the last item in the list, should NULL the pointer
   free(*ptrLocal); 
   *ptrLocal=NULL;   
}
else {
   (*ptrLocal)->previous->next = temp->next;
   (*ptrLocal)->next->previous = temp->previous;
   free(*ptrLocal);
}
我不认为有理由检查两项:

比如ABA

然后删除B:


如果你去else:你会得到AA,这仍然是一个循环列表

谢谢,但是现在if语句下的free(*ptrLocal)导致了双重免费或损坏(out)错误。第二个空闲(*ptrLocal)不会导致错误。如果在其他位置释放指针,请不要在
delete\u from\u列表中释放它。我认为免费的正确位置是在功能中,否则为什么是退货?你有过malloc或免费物品吗?如何处理函数的返回值?我看不出有什么问题,但我认为你返回一份已删除项目的副本是很奇怪的,因为如果你最初删除它,实际删除的项目将被泄露。