【发布时间】:2021-09-01 15:10:28
【问题描述】:
我很好奇什么基本情况可用于递归释放循环链表,将链表的头部作为唯一参数传递。我最初认为基本情况可能是 if (head->next == head) { return NULL; } 足以防止 head->next 指向自身,但情况似乎并非如此(从字面上和比喻上)。最后一个节点free(Head)在这里递归调用后没有被释放。
typedef struct node
{
int data;
struct node *next;
} node;
// temp stores the original head of the list
node *recursive_destroyer(node *head, node *temp)
{
if (head->next == temp)
return NULL;
recursive_destroyer(head->next, temp);
free(head);
head = NULL;
return NULL;
}
【问题讨论】:
-
这完全取决于您的实现。你所描述的应该可以正常工作,没有理由不能。
-
@Qix-MONICAWASMISTREATED 将在帖子中发布该功能。我以为我让它工作了,但似乎在递归调用后头部没有释放
-
如何表示一个空列表?
-
@rici 我有一个 freeLinkedList();处理实际列表的函数(也有一个 LinkedList 结构),它在调用此函数后释放实际列表。我无法在这里释放最后一个节点,以释放整个列表
-
@user12787203:从调用者从不使用该值的函数返回一个值并不能确保任何事情。一个好的经验法则是,一个返回 1 的函数的返回值永远不应被忽略,其返回值将被忽略的函数不应返回 1(即应声明为
void)。其他的只能迷惑人,先从作者开始。 (顺便说一句,您可以要求 GCC 验证返回值永远不会被忽略。)
标签: c recursion free circular-list