/* -------------------------------------------------------------------------------------- Programa que implementa o Tipo Abstrato de Dados Lista em Vetor Objetivo: ilustrar como fazer um log significativo Restricoes: o programa assuma que o usuario entrou com os valores corretos, inteiros. Autor: Prof. Elias P. Duarte Jr. Disciplina: Algoritmos II Data da ultima atualizacao: 2013/2 ----------------------------------------------------------------------------------------*/ #include #define TamMax 4 typedef int TipoElemento; // O programa foi feito especificamente para o tipo inteiro struct TipoLista { TipoElemento Vetor[TamMax]; int Final; // Final marca a posicao onde o proximo elemento sera inserido }; void InicLista (struct TipoLista *Lista) { Lista->Final = 0; // No inicio Final aponta para a posicao 0 do vetor printf("Iniciei a Lista, que pode ter no maximo %d elementos.\n", TamMax); } int Vazia (struct TipoLista *Lista) { return (Lista->Final == 0); } void InsereLista (int elemento, struct TipoLista *Lista) { if (Lista->Final == TamMax) printf("ERRO: impossivel inserir elemento = %d, Lista cheia!\n", elemento); else { Lista->Vetor[Lista->Final] = elemento; Lista->Final++; printf("Inseri elemento = %d na Lista\n", elemento); } } TipoElemento RetiraLista (int posicao, struct TipoLista *Lista) { int i; TipoElemento retirado; if (Vazia(Lista)) puts("ERRO: impossivel remover, Lista Vazia!"); else if (posicao >= Lista->Final) printf("ERRO: impossivel remover, posicao %d inexistente!\n", posicao); else { retirado = Lista->Vetor[posicao]; for (i = posicao; i < Lista->Final-1; i++) Lista->Vetor[i] = Lista->Vetor[i+1]; // eh preciso descolar os elementos das posicoes subsequentes apos remocao Lista->Final--; // Final eh decrementado apos o deslocamento printf("Removi elemento = %d da posicao %d da Lista\n", retirado, posicao); return retirado; } } void ImprimeLista(struct TipoLista *Lista) { int i; printf("Veja a Lista: [ "); for (i = 0; i < Lista->Final; i++) printf("%d ", Lista->Vetor[i]); printf("]\n"); } main() { struct TipoLista Numeros; TipoElemento elemento; puts("============================================================================="); puts("Inicio da execucao: programa que implementa lista em vetor para ilustrar log."); puts("Prof. Elias P. Duarte Jr. - Disciplina Algoritmos e Estruturas de Dados II"); puts("============================================================================="); InicLista(&Numeros); if (Vazia(&Numeros)) puts("A Lista estah vazia"); InsereLista(1, &Numeros); // as duas primeiras insercoes mostra a lista, as demais soh no final ImprimeLista(&Numeros); InsereLista(2, &Numeros); ImprimeLista(&Numeros); InsereLista(3, &Numeros); InsereLista(4, &Numeros); ImprimeLista(&Numeros); InsereLista(5, &Numeros); // esta insercao vai causar erro de lista cheia elemento = RetiraLista(2, &Numeros); // as duas primeiras remocoes vao imprimir a lista ImprimeLista(&Numeros); elemento = RetiraLista(0, &Numeros); ImprimeLista(&Numeros); elemento = RetiraLista (10, &Numeros); // vai causar erro, esta posicao > TamMax elemento = RetiraLista(1, &Numeros); ImprimeLista(&Numeros); elemento = RetiraLista(0, &Numeros); ImprimeLista(&Numeros); elemento = RetiraLista(0, &Numeros); // cai causar erro, a Lista jah estah vazia if (Vazia(&Numeros)) puts("A Lista estah vazia"); }