C链表销毁功能



我正在努力学习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;
    }
}

相关内容

  • 没有找到相关文章

最新更新