首页 文章

当只剩下一个节点时,删除循环链表中的函数,将下一个和前一个函数更改为null

提问于
浏览
0

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

  • 1

    你的错误是最后的错误 . 当列表中有单个节点时应用它 .

    在循环链表中,next和previuos永远不应该为NULL

    因此,如果只有1个项目,则next和previous应指向自身 .

    现在你应该像这样检查:

    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 < - > A.

    你删除B:

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

相关问题