#include "stdio.h" struct SNo { int c; SNo * prox; SNo * ant; }; SNo * par = NULL; SNo * impar = NULL; SNo * mult3 = NULL; void Insere(SNo * * fim, char c); void Mostra(SNo * fim); void MostraInvertido(SNo * fim); void main() { int i; SNo * no; while( i != -1) { printf("Digite um numero qualquer ou -1 para sair: "); scanf("%d",&i); if( i != -1) { if( i%2 == 0) Insere(&par,i); if( i%2 != 0) Insere(&impar,i); if( i%3 == 0) Insere(&mult3,i); } } printf("----------------------------------------\n"); printf("Mostrando Lista na Ordem Inversa da Insercao:\n"); printf("Lista de Pares: "); MostraInvertido(par); printf("Lista de Impares: "); MostraInvertido(impar); printf("Lista de Multiplos de 3: "); MostraInvertido(mult3); printf("----------------------------------------\n"); printf("Mostrando Lista na Ordem da Insercao:\n"); printf("Lista de Pares: "); Mostra(par); printf("\nLista de Impares: "); Mostra(impar); printf("\nLista de Multiplos de 3: "); Mostra(mult3); printf("\n"); } // Note que a insercao eŽ feita no final da lista. // Alterar este codigo para manipular um ponteiro para // o inicio e outro para final eŽ um exercicio // interessante. Altere as funcoes mostra e mostrainvertido // para que elas "tirem proveito" do novo ponteiro. void Insere(SNo * * fim, char c) { SNo * no; no = new SNo; no->c = c; no->prox = NULL; no->ant = *fim; if(*fim != NULL) (*fim)->prox = no; *fim = no; } // Como temos apenas um ponteiro para o final da lista, eŽ // mais facil imprimir a lista de traz para frente. O codigo // abaixo faz exatamente isto. void MostraInvertido(SNo * fim) { SNo * t; for( t = fim ; t != NULL ; t = t->ant ) { printf("%d ",t->c); } printf("\n"); } // Para imprimir a lista do inicio para fim podemos usar // recursao, como no codigo abaixo. void Mostra(SNo * fim) { if(fim==NULL) return; else { Mostra(fim->ant); printf("%d ",fim->c); } }