我正在尝试学习 C,而且和很多人一样,我一直对指针感到有点困惑。无论如何,我创建了一个递归函数,它破坏了我的链表,但是正如我调试的那样,当我从函数返回时,列表的头部不是应该为空的,所以我猜这是对指针的一些基本误解. 这是功能:
void destroy(struct node *n) {
if (!n) return;
destroy(n->next);
free(n);
n = NULL;
}
我正在尝试学习 C,而且和很多人一样,我一直对指针感到有点困惑。无论如何,我创建了一个递归函数,它破坏了我的链表,但是正如我调试的那样,当我从函数返回时,列表的头部不是应该为空的,所以我猜这是对指针的一些基本误解. 这是功能:
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 已被释放,但它不为空。C 中的所有内容都是按值传递的。因此,您将 head 位置的副本传递给 destroy 。该内存被释放,但 head 没有改变。
你可以这样写:
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
。它实际上没有任何作用,因此您可以删除此语句。
如果需要,您应该在调用者函数中调用head
toNULL
之后将其设置为。destroy
这是使用以下方法破坏链接列表的示例函数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;
}
}