/* Antonio Ricardo Alexandre Brasil
21/05/2014
*/
#include <stdio.h>
#include <stdlib.h>
struct lista {
int info;
struct lista *prox;
}; // Lista com um numero e o ponteiro para a proxima lista
Lista* inicializa() {
return NULL; // Retorna como nulo
}
Lista* insere(Lista* p, int v) { // Insere um elemento na lista e retorna a lista
Lista* l = (Lista*) malloc(sizeof(Lista));
l->info = v;
l->prox = p;
return l;
}
Lista* inverteIterativo(Lista* p) {
Lista* aux = p; // Faz um for que percorre a lista e adiciona os numeros em uma lista nova
Lista* nova; // o for percorre os numeros de tras para frente
nova = inicializa(); // por isso a invers?o funciona
while(aux != NULL) {
nova = insere(nova, aux->info);
aux = aux->prox;
}
return nova;
}
Lista* inverteRecursivo(Lista* l, Lista* ant) {
/*
Eu posso passar o anterior como parametro e ir invertendo a lista seguindo a logica recursiva
ele vai parar quando n?o tiver mais como inverter
Detalhe: ele vai modificando o L
*/
if(l == NULL) {
return ant;
}
Lista* atual;
atual = l;
// L = [10] -> [9] -> [8] -> [7] -> [6]
// atual = [10] -> [9] -> [8] -> [7] -> [6]
// L = [9] -> ...
// atual = [10] -> [9] = [10] -> NULL
l = l->prox;
atual->prox = ant;
return inverteRecursivo(l, atual);
}
void libera(Lista* p) { //libera a lista da memoria
Lista* l = p;
while(l != NULL) {
Lista* t = l->prox;
free(l);
l = t;
}
}
void imprime(Lista* p) { // imprime a lista
Lista* aux = p;
while(aux != NULL) {
printf("Numero %d\n", aux->info);
aux = aux->prox;
}
}