Advertisement
hmcristovao

Lista 11 - exemplo 2

Aug 20th, 2013
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.75 KB | None | 0 0
  1. // TAD (Tipo Abstrato de Dados) - lista de aniversariantes
  2. // Versão 2: vetor de ponteiros (utilização melhor da memória, e mais eficiente)
  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 {
  20.    int qtde;
  21.    Aniversariante *vetor[MAX_LISTA_VETOR];  // os elementos do vetor são ponteiros
  22. } Lista;
  23.  
  24. // protótipos
  25. void inicia(Lista *lista);
  26. int insere(Lista *lista, Aniversariante *elemento);
  27. void entrada(Aniversariante *elemento);
  28. void exibe(Aniversariante *elemento);
  29.  
  30. // Inclui 2 aniversariantes na lista
  31. int main() {
  32.    // cria a lista alocando apenas um ponteiro para cada aniversariante, independente de usar ou não
  33.    Lista lista;
  34.    inicia(&lista);
  35.  
  36.    Aniversariante *aux; // nesta versão, ao invés de alocar uma estrutura aloca-se um ponteiro
  37.  
  38.    // entrada e armazenamento do primeiro aniversariante
  39.    // nesta versão, para cada novo aniversariante deve-se alocar uma nova memória
  40.    aux = (Aniversariante*)malloc(sizeof(Aniversariante));
  41.    entrada(aux);  // aux é passado diretamente, pois é um endereço
  42.    insere(&lista,aux); // aux é passado diretamente, pois é um endereço
  43.  
  44.    // entrada e armazenamento do primeiro aniversariante
  45.    aux = (Aniversariante*)malloc(sizeof(Aniversariante));
  46.    entrada(aux);
  47.    insere(&lista,aux);
  48.  
  49.    // exibe toda a lista de aniversariantes
  50.    int i;
  51.    for(i=0; i < lista.qtde; i++)
  52.       exibe(lista.vetor[i]);  // nesta versão, basta passar o elemento do vetor, que é um endereço
  53.  
  54.    return 0;
  55. }
  56.  
  57. // inicializa a lista, ajustando a qtde para zero
  58. void inicia(Lista *lista) {
  59.     lista->qtde = 0;
  60. }
  61.  
  62. // insere um aniversariante na lista
  63. int insere(Lista *lista, Aniversariante *elemento) {
  64.    if(lista->qtde == MAX_LISTA_VETOR)
  65.       return 0; // indicação de erro: atingiu o limite da lista
  66.    lista->vetor[lista->qtde] = elemento;  // na versão 2, apenas o endereço é copiado para o vetor
  67.    lista->qtde++;
  68.    return 1;
  69. }
  70.  
  71. // recebe da entrada padrão os dados de um aniversariante e o coloca na memória "elemento"
  72. void entrada(Aniversariante *elemento) {
  73.    printf("\nEntre com o nome do aniversariante: ");
  74.    fflush(stdin);
  75.    gets(elemento->apelido);
  76.    printf("Entre com o dia e mes do aniversario: ");
  77.    scanf("%d %d", &elemento->dataAniver.dia, &elemento->dataAniver.mes);
  78. }
  79.  
  80. // exibe os dados de um aniversariante passado como argumento
  81. void exibe(Aniversariante *elemento) {
  82.    printf("\nNome: %s \nData do aniversario: %02d/%02d", elemento->apelido,
  83.            elemento->dataAniver.dia, elemento->dataAniver.mes);
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement