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

标签 c linked-list nodes

在循环双向链表的删除函数中,当我输入具有两个节点的函数并删除一个节点时,它会将下一个节点和上一个节点更改为空。仅当我输入链表中有两个节点的函数时才会发生这种情况。我在 Eclipse 中使用断点,一切似乎都正常,直到我结束函数并返回临时值。之后 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 和 previuo 永远不应该为 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:

如果你转到else:你会得到A<->A,它仍然是一个循环列表。

关于c - 循环链表中的删除函数,当只剩下一个节点时,将下一个和上一个更改为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26857123/

相关文章:

c - C中反转字符串的函数

data-structures - 为什么 insertVertex 需要 O(1) 而 deleteVertex 在这里需要 O(m) 我是否正确?

c - 在 C 中反序列化文本文件数据(链表)

java - 从 N 叉树中随机选择一个节点

C程序只有两个循环

c++ - C++中的客户端/服务器程序问题

c - 如何处理来自 Linux 内核模块中已经具有不可共享处理程序的 PCI 设备的中断?

c - 为什么我的链表显示垃圾值

c++ - node, & node 和 node->next in 链表的区别

javascript - 是否值得在 Javascript 中创建一个 LinkedList