c-当只剩下一个节点时,循环链表中的Delete函数将next和previor更改为null



在我的循环双链表的删除函数中,当我输入具有两个节点的函数并删除一个节点时,它会将我的下一个节点和上一个节点更改为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。

您的错误是最后一个错误。当列表中有单个节点时,它会应用。

在循环链表中,next和previos永远不应该是NULL

因此,如果只有一个项目,下一个和上一个应该指向它自己。

现在你应该这样检查:

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

我看不出检查两项的原因:

例如A<->B<->

你删除B:

如果你去其他地方:你会得到A<->A仍然是一个循环列表。

最新更新