3

我正在尝试学习 C,而且和很多人一样,我一直对指针感到有点困惑。无论如何,我创建了一个递归函数,它破坏了我的链表,但是正如我调试的那样,当我从函数返回时,列表的头部不是应该为空的,所以我猜这是对指针的一些基本误解. 这是功能:

void destroy(struct node *n) {
   if (!n) return;
   destroy(n->next);
   free(n);
   n = NULL;
}
4

5 回答 5

7
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;
}

像这样尝试....您可以根据需要更改名称。如果您仍然需要帮助,请告诉我。

于 2013-08-23T22:18:22.160 回答
3

此函数结束时,Head 已被释放,但它不为空。C 中的所有内容都是按值传递的。因此,您将 head 位置的副本传递给 destroy 。该内存被释放,但 head 没有改变。

你可以这样写:

destroy(&head);

void destroy(struct node** n){
   if(!*n) return;
   destroy(&((*n)->next));
   free(*n);
   *n = NULL; 
}
于 2013-08-23T22:17:12.063 回答
1

您必须使用指向您的列表的指针,调用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);
}

希望这可以帮助你。

于 2013-08-23T22:16:44.057 回答
0

您的递归destroy函数无法修改head调用者框架中的变量。

该语句n = NULL只影响函数参数,它是函数的局部变量destroy。它实际上没有任何作用,因此您可以删除此语句。

如果需要,您应该在调用者函数中调用headtoNULL之后将其设置为。destroy

于 2020-02-14T08:22:02.920 回答
0

这是使用以下方法破坏链接列表的示例函数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;
    }
}
于 2020-07-14T13:53:38.823 回答