fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct no {
  5. int data;
  6. struct no *prox;
  7. };
  8.  
  9. void finaliza_recursivo(struct no **inicio) {
  10. if (*inicio != NULL) finaliza_recursivo(&(*inicio)->prox);
  11. free(*inicio);
  12. *inicio = NULL;
  13. }
  14.  
  15. void cria(struct no **inicio) {
  16. *inicio = NULL;
  17. }
  18.  
  19. void inserir (struct no **inicio, int *valor, int *erro) {
  20. struct no *tmp;
  21. tmp = malloc(sizeof *tmp);
  22. *erro = 1; /* assume que vai haver erro */
  23. if (tmp != NULL) {
  24. *erro = 0; /* afinal nao houve erro */
  25. tmp->data = *valor;
  26. tmp->prox = *inicio;
  27. *inicio = tmp;
  28. }
  29. }
  30.  
  31. void imprimir(struct no *inicio, const char *msg) {
  32. int empty = 1;
  33. if (msg) printf("%s:", msg);
  34. while (inicio) {
  35. printf(" %d", inicio->data);
  36. inicio = inicio->prox;
  37. empty = 0;
  38. }
  39. puts(empty ? " (lista vazia)" : "");
  40. }
  41.  
  42. int main(void) {
  43. struct no *ini; /* e um ponteiro para um bloquinho (inicio da lista) */
  44. int x;
  45. int erro;
  46.  
  47. cria(&ini);
  48.  
  49. imprimir(ini, "recem criada");
  50.  
  51. x = 2;
  52. inserir(&ini, &x, &erro);
  53. imprimir(ini, "depois de inserir 2");
  54. x = 3;
  55. inserir(&ini, &x, &erro);
  56. imprimir(ini, "depois de inserir 3");
  57. x = 8;
  58. inserir(&ini, &x, &erro);
  59. imprimir(ini, "depois de inserir 8");
  60.  
  61. finaliza_recursivo(&ini);
  62. imprimir(ini, "depois de finaliza_recursivo");
  63.  
  64. return 0;
  65. }
  66.  
Success #stdin #stdout 0s 2380KB
stdin
Standard input is empty
stdout
recem criada: (lista vazia)
depois de inserir 2: 2
depois de inserir 3: 3 2
depois de inserir 8: 8 3 2
depois de finaliza_recursivo: (lista vazia)