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

Posted

技术标签:

【中文标题】当只剩下一个节点时,循环链表中的删除函数将next和previous更改为null【英文标题】:Delete function in circular linked list changing next and previous to null when only one node left 【发布时间】:2015-01-07 13:02:15 【问题描述】:

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

在 return temp ptrLocal->next 和 preLocal->previous 后都设置为 null。

【问题讨论】:

您是否使用过 malloc 或免费物品?你如何处理函数的返回值?我没有看到问题(目前),但我认为您返回已删除项目的副本很奇怪,因为如果您最初对其进行了 malloc,实际删除的项目将被泄露。 【参考方案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);

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

例如ABA

然后你删除 B:

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

【讨论】:

谢谢,但现在 if 语句下的 free(*ptrLocal) 导致双重释放或损坏(out)错误。第二个free(*ptrLocal) 不会导致报错 如果您在别处释放指针,请不要在delete_from_list 中释放它。我觉得free的地方应该在函数里面,不然怎么return呢?

以上是关于当只剩下一个节点时,循环链表中的删除函数将next和previous更改为null的主要内容,如果未能解决你的问题,请参考以下文章

循环链表

数据结构:单向循环链表

数据结构:单向循环链表

(java实现)双向循环链表

C语言教程“双向循环链表”学习总结及其代码实现

4. 单向循环链表