Advertisement
hmcristovao

Lista 11 - exemplo 3

Aug 20th, 2013
329
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | None | 0 0
  1. // TAD (Tipo Abstrato de Dados) - lista de aniversariantes
  2. // Versão 3: lista encadeada (utilização bastante otimizada da memória)
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #define MAX_LISTA_VETOR 50
  8. #define MAX_CARACTERES_NOME 20
  9.  
  10. typedef struct {
  11.    int dia, mes;
  12. } DataAniver;
  13.  
  14. typedef struct {
  15.    char apelido[MAX_CARACTERES_NOME];
  16.    DataAniver dataAniver;
  17. } Aniversariante;
  18.  
  19. typedef struct no { // estruturas auto-referenciadas exigem um nome na declaração da struct
  20.    Aniversariante *info;
  21.    struct no *prox;
  22. } No;
  23.  
  24. typedef struct {
  25.    int qtde;
  26.    No *inicio;
  27. } Lista;
  28.  
  29. // protótipos
  30. void inicia(Lista *pLista);
  31. int insere(Lista *pLista, Aniversariante *elemento);
  32. void entrada(Aniversariante *elemento);
  33. void exibe(Aniversariante *elemento);
  34. void exibeTudo(Lista *pLista);
  35.  
  36. // Inclui 2 aniversariantes na lista
  37. int main() {
  38.    // cria a lista alocando apenas um ponteiro.
  39.    Lista lista;
  40.    inicia(&lista);
  41.  
  42.    Aniversariante *aux;
  43.  
  44.    // entrada e armazenamento do primeiro aniversariante
  45.    aux = (Aniversariante*)malloc(sizeof(Aniversariante));
  46.    entrada(aux);
  47.    insere(&lista,aux);
  48.  
  49.    // entrada e armazenamento do primeiro aniversariante
  50.    aux = (Aniversariante*)malloc(sizeof(Aniversariante));
  51.    entrada(aux);
  52.    insere(&lista,aux);
  53.  
  54.    // exibe toda a lista de aniversariantes
  55.    exibeTudo(&lista);
  56.  
  57.    return 0;
  58. }
  59.  
  60. // inicializa a lista, ajustando a qtde para zero e o ponteiro inicial para NULL
  61. void inicia(Lista *pLista) {
  62.     pLista->qtde = 0;
  63.     pLista->inicio = NULL;
  64. }
  65.  
  66. // insere um aniversariante na lista
  67. int insere(Lista *pLista, Aniversariante *elemento) {
  68.    No *novo = (No*)malloc(sizeof(No));
  69.    novo->prox = pLista->inicio;
  70.    pLista->inicio = novo;
  71.    novo->info = elemento;
  72.    pLista->qtde++;
  73. }
  74.  
  75. // recebe da entrada padrão os dados de um aniversariante e o coloca na memória "elemento"
  76. void entrada(Aniversariante *elemento) {
  77.    printf("\nEntre com o nome do aniversariante: ");
  78.    fflush(stdin);
  79.    gets(elemento->apelido);
  80.    printf("Entre com o dia e mes do aniversario: ");
  81.    scanf("%d %d", &elemento->dataAniver.dia, &elemento->dataAniver.mes);
  82. }
  83.  
  84. // exibe os dados de um aniversariante passado como argumento
  85. void exibe(Aniversariante *elemento) {
  86.    printf("\nNome: %s \nData do aniversario: %02d/%02d", elemento->apelido,
  87.            elemento->dataAniver.dia, elemento->dataAniver.mes);
  88. }
  89.  
  90. // exibe toda a lista
  91. void exibeTudo(Lista *pLista) {
  92.    int i;
  93.    // o ponteiro p aponta para o início da lista e a cada iteração aponta para o próximo elemento
  94.    No *p = pLista->inicio;
  95.    for(i=0; i < pLista->qtde; i++) {
  96.       exibe(p->info);
  97.       p = p->prox;  // faz p apontar para o próximo elemento
  98.    }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement