我需要制作一个函数,删除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_head
的LInt
变量。
所以,这条线:
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;
}