Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. /* Antonio Ricardo Alexandre Brasil
  2.     21/05/2014
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. struct lista {
  8.     int info;
  9.     struct lista *prox;
  10. }; // Lista com um numero e o ponteiro para a proxima lista
  11.  
  12. Lista* inicializa() {
  13.     return NULL; // Retorna como nulo
  14. }
  15. Lista* insere(Lista* p, int v) { // Insere um elemento na lista e retorna a lista
  16.     Lista* l = (Lista*) malloc(sizeof(Lista));
  17.     l->info = v;
  18.     l->prox = p;
  19.     return l;
  20. }
  21. Lista* inverteIterativo(Lista* p) {
  22.     Lista* aux = p;                         // Faz um for que percorre a lista e adiciona os numeros em uma lista nova
  23.     Lista* nova;                            // o for percorre os numeros de tras para frente
  24.     nova = inicializa();                    // por isso a invers?o funciona
  25.     while(aux != NULL) {
  26.         nova = insere(nova, aux->info);
  27.         aux = aux->prox;
  28.     }
  29.     return nova;
  30. }
  31. Lista* inverteRecursivo(Lista* l, Lista* ant) {
  32.     /*
  33.         Eu posso passar o anterior como parametro e ir invertendo a lista seguindo a logica recursiva
  34.         ele vai parar quando n?o tiver mais como inverter
  35.         Detalhe: ele vai modificando o L
  36.     */
  37.  
  38.     if(l == NULL) {
  39.         return ant;
  40.     }
  41.     Lista* atual;
  42.     atual = l;
  43.     // L = [10] -> [9] -> [8] -> [7] -> [6]
  44.     // atual = [10] -> [9] -> [8] -> [7] -> [6]
  45.     // L = [9] -> ...
  46.     // atual = [10] -> [9] = [10] -> NULL
  47.  
  48.  
  49.     l = l->prox;
  50.     atual->prox = ant;
  51.  
  52.     return inverteRecursivo(l, atual);
  53.  
  54. }
  55.  
  56.  
  57.  
  58. void libera(Lista* p) { //libera a lista da memoria
  59.     Lista* l = p;
  60.     while(l != NULL) {
  61.         Lista* t = l->prox;
  62.         free(l);
  63.         l = t;
  64.     }
  65. }
  66.  
  67. void imprime(Lista* p) { // imprime a lista
  68.     Lista* aux = p;
  69.     while(aux != NULL) {
  70.         printf("Numero %d\n", aux->info);
  71.         aux = aux->prox;
  72.  
  73.    }
  74. }