Recursive function to finalize a list

1

I want to do a recursive function to deallocate the memory of each block of the list, but when I print it after using the function, it loops and memory addresses are printed when I ask to print (the correct thing is not to print anything).

  

Declaration on main: on the list;

     

Call on main: end_recursive (& list);

     

no * list is just a pointer to the first element (block) of the list.

Below two versions of the same function, the two are giving the same problem:

  

Main

int main()
{
    no *ini; //é um ponteiro para um bloquinho (inicio da lista)
    elem x;
    int erro;

    cria(&ini);

    x = 2;
    inserir(&ini, &x, &erro);
    x = 3;
    inserir(&ini, &x, &erro);
    x = 8;
    inserir(&ini, &x, &erro);

    imprimir(ini);

    finaliza_recursivo(&ini);

    return 0;
}
  

Functions

void cria(no **inicio)
{
    *inicio = NULL;
}

void finaliza_recursivo(no **inicio)
{
    no *P;

    P = *inicio;

    if(P != NULL)
        finaliza_recursivo(&P->prox);
    free(P);
}

void finaliza_recursivo(no **inicio)
{
    if(*inicio != NULL)
        finaliza_recursivo(&(*inicio)->prox);
    free(*inicio);
}
    
asked by anonymous 03.10.2014 / 22:27

1 answer

0

After doing free() the contents of the variable gets an invalid value.

I would suggest replacing this invalid value with NULL .

void finaliza_recursivo(no **inicio)
{
    if(*inicio != NULL)
        finaliza_recursivo(&(*inicio)->prox);
    free(*inicio);
    *inicio = NULL; /* limpa valor inválido */
}

I suppose your problem is not in the function you say.

Here's a full version of the program:

#include <stdio.h>
#include <stdlib.h>

struct no {
  int data;
  struct no *prox;
};

void finaliza_recursivo(struct no **inicio) {
  if (*inicio != NULL) finaliza_recursivo(&(*inicio)->prox);
  free(*inicio);
  *inicio = NULL;
}

void cria(struct no **inicio) {
  *inicio = NULL;
}

void inserir (struct no **inicio, int *valor, int *erro) {
  struct no *tmp;
  tmp = malloc(sizeof *tmp);
  *erro = 1; /* assume que vai haver erro */
  if (tmp != NULL) {
    *erro = 0; /* afinal nao houve erro */
    tmp->data = *valor;
    tmp->prox = *inicio;
    *inicio = tmp;
  }
}

void imprimir(struct no *inicio, const char *msg) {
  int empty = 1;
  if (msg) printf("%s:", msg);
  while (inicio) {
    printf(" %d", inicio->data);
    inicio = inicio->prox;
    empty = 0;
  }
  puts(empty ? " (lista vazia)" : "");
}

int main(void) {
    struct no *ini; /* e um ponteiro para um bloquinho (inicio da lista) */
    int x;
    int erro;

    cria(&ini);

    imprimir(ini, "recem criada");

    x = 2;
    inserir(&ini, &x, &erro);
    imprimir(ini, "depois de inserir 2");
    x = 3;
    inserir(&ini, &x, &erro);
    imprimir(ini, "depois de inserir 3");
    x = 8;
    inserir(&ini, &x, &erro);
    imprimir(ini, "depois de inserir 8");

    finaliza_recursivo(&ini);
    imprimir(ini, "depois de finaliza_recursivo");

    return 0;
}
    
04.10.2014 / 09:40