C-链表:free()函数是删除我的头节点;如何正确使用free()



我需要制作一个函数,删除c中链表的前n个节点,并返回删除的节点数。如果列表小于n,则该列表应为空此外,我不能使用递归

按照现在的代码,它可以工作,但我不会释放"已删除"节点的内存。如果我取消注释应该释放内存的部分,我会在代码板上得到这个错误。io:

Input: 5 + [ 61 62 63 64 65 66 ]
Output: expected 5 + [ 66 ]
        obtained 5 + [19333664 ]

这个随机数似乎是在访问内存中的"垃圾"。如何正确释放不再使用的节点?

listas.h中的代码:

typedef struct lligada {
    int valor;
    struct lligada *prox;
} *LInt;
LInt newLInt (int, LInt);
int drop (int, LInt *);

listas.c内的代码

#include <stdlib.h>
#include "listas.h"
int drop (int n, LInt *l){
    int count = 0;
    LInt *aux;
    while(n>0 && (*l)!=NULL){
          n--;
          count++;
          //aux = &((*l));
          *l = (*l)->prox;
          //free(*aux);
    }
return count;
}

练习的代码板链接:https://codeboard.io/projects/16259

注意,LInt被定义为指向struct lligada指针。因此,drop函数的l参数是指向struct lligada指针。让我们调用l指向list_headLInt变量。

所以,这条线:

aux = &((*l));

实际上是将list_head的地址分配给aux,而不是list_head指向的struct lligada

因此,解决方案是将aux定义为LInt,然后执行:

aux = *l;
*l = (*l)->prox;
free(aux);

希望能有所帮助。

我通过不将aux设为双指针,得出了与jboockmann类似的解决方案,但正如我在他的解决方案中所说,我不明白这是什么以及为什么错了。

int drop (int n, LInt *l){
    int count = 0;
    LInt aux;
    while(n>0 && (*l)!=NULL){
          n--;
          count++;
          aux = *l;
          *l = (*l)->prox;
          free(aux);
        }
    return count;
}

相关内容

  • 没有找到相关文章

最新更新