我正在努力学习C,和许多人一样,我也有点被指针卡住了。无论如何,我制作了一个递归函数,它会破坏我的链表,但正如我调试的那样,当我从函数返回时,列表的头部并不是应该的null,所以我猜这是对指针的一些基本误解。功能如下:
void destroy(struct node *n) {
if (!n) return;
destroy(n->next);
free(n);
n = NULL;
}
void deleteList(struct node** head_ref)
{
struct node* current = *head_ref;
struct node* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
*head_ref = NULL;
}
试着这样。。。。你可以随意更改名称。如果你还需要帮助,请告诉我。
Head在该函数结束时已被释放,但它不是null。C中的所有内容都通过值传递。所以你把一份头部位置的副本传给销毁。内存被释放,但磁头没有改变。
你可以这样写:
destroy(&head);
void destroy(struct node** n){
if(!*n) return;
destroy(&((*n)->next));
free(*n);
*n = NULL;
}
您必须使用指向列表的指针,用destroy(&n)
:调用
// clear complete list
void destroy(struct node **n)
{
if (*n == NULL)
return;
if ((*n)->next == NULL)
{
free(*n);
*n= NULL;
return;
}
struct node *iter = *n;
struct node *prev = NULL;
// get last item and the previous one
while (iter->next != NULL)
{
prev = iter;
iter = iter -> next;
}
prev->next = NULL;
free(iter);
destroy(n);
}
希望这能对你有所帮助。
递归destroy
函数无法修改调用方框架中的head
变量。
语句n = NULL
只影响函数自变量,该自变量是destroy
函数的局部变量。它实际上没有任何效果,所以您可以删除此语句。
如果需要的话,应该在调用方函数中调用destroy
之后将head
设置为NULL
。
以下是使用DeleteRear()
:销毁链表的示例函数
void Destroy_Using_Rear(List *L)
{
int y;
Node *P,*Q,*Z;
while(P!=NULL){
y=DeleteRear(L,x);
return y;
Z=P;
P=*L;
}
}