我需要创建一个函数,在c中删除链表的前n个节点,并返回已删除节点的数量。如果列表小于n,则它应该为空。 另外,我不能使用recursvity。
使用现在的代码,它可以工作,但我没有释放“已删除”节点的内存。如果我取消注释应释放内存的部分,我在codeboard.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;
}
答案 0 :(得分:1)
我通过不使用辅助指针来达到类似于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;
}
答案 1 :(得分:1)
请注意,LInt
它被定义为指针到struct lligada
。因此,l
函数的drop
参数是指向<{em>}指针的指针。让我们调用struct lligada
指向LInt
的{{1}}变量。
所以,行:
l
实际上是list_head
分配aux = &((*l));
的地址而不是aux
指向的list_head
地址。
因此,解决方案是将struct lligada
定义为list_head
,然后执行:
aux
希望有所帮助。