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

时间:2016-05-19 17:36:15

标签: c pointers linked-list segmentation-fault

我需要创建一个函数,在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;
}

行使的键盘链接:https://codeboard.io/projects/16259

2 个答案:

答案 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

希望有所帮助。