Advertisement
hmcristovao

Lista 11 - exercício 2

Sep 4th, 2013
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.60 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_NOME 100
  6. #define ARQUIVOENTRADA "registros.txt"
  7.  
  8. typedef struct {
  9.    char nome[MAX_NOME];
  10.    long int codigo;
  11. } Registro;
  12.  
  13. typedef struct no {
  14.    Registro *info;
  15.    struct no *prox;
  16. } No;
  17.  
  18. typedef struct {
  19.    int qtde;
  20.    No *inicio;
  21. } Lista;
  22.  
  23. // prototipos:
  24. void iniciaLista(Lista *pLista);
  25. void carregaArquivo(char *nomeArquivo, Lista *pLista);
  26. void insereRegistro(Lista *pLista, long codigo, char *nomeAlocado);
  27. Registro* buscaRegistroAproximado(Lista *pLista, long codigoProcurado);
  28. void exibeRegistro(Registro *registro);
  29. void exibeTudo(Lista *pLista);
  30.  
  31. int main() {
  32.    // inicializa a lista
  33.    Lista listaRegistros;
  34.    iniciaLista(&listaRegistros);
  35.  
  36.    // transfere os dados do arquivo para a lista encadeada
  37.    carregaArquivo(ARQUIVOENTRADA, &listaRegistros);
  38.  
  39.    // exibe todos os registros
  40.    printf("\nTodos os registros:");
  41.    exibeTudo(&listaRegistros);
  42.  
  43.    // possibilita ao usuário a realização de uma busca aproximada a partir de um código informado
  44.    // antes, verifica se a lista está vazia
  45.    if(listaRegistros.qtde == 0) {
  46.       printf("Lista vazia\n");
  47.       return 0;
  48.    }
  49.    long codigoProcurado;
  50.    Registro *registroEncontrado;
  51.    printf("\n\nQual o codigo para busca? ");
  52.    scanf("%ld", &codigoProcurado);
  53.    registroEncontrado = buscaRegistroAproximado(&listaRegistros, codigoProcurado);
  54.    exibeRegistro(registroEncontrado);
  55.  
  56.    return 0;
  57. }
  58.  
  59. void iniciaLista(Lista *pLista) {
  60.    pLista->qtde=0;
  61.    pLista->inicio=NULL;
  62. }
  63.  
  64. // transfere os dados do arquivo para a lista
  65. void carregaArquivo(char *nomeArquivo, Lista *pLista) {
  66.    FILE *fp = fopen(nomeArquivo,"r");
  67.    // se não conseguiu abrir o arquivo, sinaliza com erro e sai do programa
  68.    if(fp == NULL) {
  69.       printf("ERRO: arquivo %s nao encontrado\n", nomeArquivo);
  70.       exit(1);
  71.    }
  72.    long codigo;
  73.    char nomeAux[MAX_NOME];  // memória local, será desalocada ao término desta função
  74.    char *nomeAlocado;       // ponteiro para a memória que será alocada com malloc (permanecerá durante toda a execução do programa)
  75.    // lê todos os registros do arquivo e os insere na lista
  76.    while(fscanf(fp,"%ld %s", &codigo, nomeAux) != EOF) {
  77.       // faz a alocação sob medida para o tamanho do nome (+1 é por causa do nulo)
  78.       // essa alocação com malloc é necessária para que a memória não seja desalocada automaticamente ao término da função
  79.       nomeAlocado = (char*)malloc(sizeof(char)*strlen(nomeAux)+1);
  80.       // copia o nome da memória local para a memória alocada
  81.       strcpy(nomeAlocado, nomeAux);
  82.       insereRegistro(pLista, codigo, nomeAlocado);
  83.       pLista->qtde++;
  84.    }
  85.    fclose(fp);
  86.    return;
  87. }
  88.  
  89. // insere na lista um registro, cujo código e nome são passados por argumentos
  90. void insereRegistro(Lista *pLista, long codigo, char *nomeAlocado) {
  91.    // criação/alocação do novo registro
  92.    Registro *novoRegistro;
  93.    novoRegistro = (Registro*)malloc(sizeof(Registro));
  94.    novoRegistro->codigo = codigo;
  95.    strcpy(novoRegistro->nome, nomeAlocado);
  96.  
  97.    // criação/alocação do novo nó
  98.    No *novoNo;
  99.    novoNo = (No*)malloc(sizeof(No));
  100.    novoNo->info = novoRegistro;
  101.    novoNo->prox = pLista->inicio;
  102.    pLista->inicio = novoNo;
  103.  
  104.    return;
  105. }
  106.  
  107. // retorna o endereço do registro cujo código é o exato ou o próximo na lista (o imediatamente menor)
  108. Registro* buscaRegistroAproximado(Lista *pLista, long codigoProcurado) {
  109.    // ponteiro p para percorrer a lista, inicia apontando para o início da lista
  110.    No *p = pLista->inicio;
  111.    int i;
  112.    // percorre toda a lista (exceto o último que será retonado caso não exista um código menor do que o procurado)
  113.    for(i=0; i < pLista->qtde-1; i++) {
  114.       // se o código procurado for menor, continua a busca
  115.       if(codigoProcurado < p->info->codigo) {
  116.          p = p->prox;  // faz p apontar para o próximo elemento da lista
  117.          continue;
  118.       }
  119.       // senão, retorna o registro (exato ou aproximado)
  120.       else
  121.          return p->info;
  122.    }
  123.    // se chegou ao fim da lista, retorna o último elemento
  124.    return p->info;
  125. }
  126.  
  127. void exibeTudo(Lista *pLista) {
  128.    // ponteiro p para percorrer a lista, inicia apontando para o início da lista
  129.    No *p = pLista->inicio;
  130.    int i;
  131.    for(i=0; i < pLista->qtde; i++) {
  132.       exibeRegistro(p->info);
  133.       p = p->prox; // faz p apontar para o próximo elemento da lista
  134.    }
  135.    return;
  136. }
  137.  
  138. // exibe apenas um registro
  139. void exibeRegistro(Registro *registro) {
  140.    printf("\nCodigo: %ld \tNome: %s", registro->codigo, registro->nome);
  141.    return;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement