#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;
}
