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