Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX_NOME 100
- #define ARQUIVOENTRADA "registros.txt"
- typedef struct {
- char nome[MAX_NOME];
- long int codigo;
- } Registro;
- typedef struct no {
- Registro *info;
- struct no *prox;
- } No;
- typedef struct {
- int qtde;
- No *inicio;
- } Lista;
- // prototipos:
- void iniciaLista(Lista *pLista);
- void carregaArquivo(char *nomeArquivo, Lista *pLista);
- void insereRegistro(Lista *pLista, long codigo, char *nomeAlocado);
- Registro* buscaRegistroAproximado(Lista *pLista, long codigoProcurado);
- void exibeRegistro(Registro *registro);
- void exibeTudo(Lista *pLista);
- int main() {
- // inicializa a lista
- Lista listaRegistros;
- iniciaLista(&listaRegistros);
- // transfere os dados do arquivo para a lista encadeada
- carregaArquivo(ARQUIVOENTRADA, &listaRegistros);
- // exibe todos os registros
- printf("\nTodos os registros:");
- exibeTudo(&listaRegistros);
- // possibilita ao usuário a realização de uma busca aproximada a partir de um código informado
- // antes, verifica se a lista está vazia
- if(listaRegistros.qtde == 0) {
- printf("Lista vazia\n");
- return 0;
- }
- long codigoProcurado;
- Registro *registroEncontrado;
- printf("\n\nQual o codigo para busca? ");
- scanf("%ld", &codigoProcurado);
- registroEncontrado = buscaRegistroAproximado(&listaRegistros, codigoProcurado);
- exibeRegistro(registroEncontrado);
- return 0;
- }
- void iniciaLista(Lista *pLista) {
- pLista->qtde=0;
- pLista->inicio=NULL;
- }
- // transfere os dados do arquivo para a lista
- void carregaArquivo(char *nomeArquivo, Lista *pLista) {
- FILE *fp = fopen(nomeArquivo,"r");
- // se não conseguiu abrir o arquivo, sinaliza com erro e sai do programa
- if(fp == NULL) {
- printf("ERRO: arquivo %s nao encontrado\n", nomeArquivo);
- exit(1);
- }
- long codigo;
- char nomeAux[MAX_NOME]; // memória local, será desalocada ao término desta função
- char *nomeAlocado; // ponteiro para a memória que será alocada com malloc (permanecerá durante toda a execução do programa)
- // lê todos os registros do arquivo e os insere na lista
- while(fscanf(fp,"%ld %s", &codigo, nomeAux) != EOF) {
- // faz a alocação sob medida para o tamanho do nome (+1 é por causa do nulo)
- // essa alocação com malloc é necessária para que a memória não seja desalocada automaticamente ao término da função
- nomeAlocado = (char*)malloc(sizeof(char)*strlen(nomeAux)+1);
- // copia o nome da memória local para a memória alocada
- strcpy(nomeAlocado, nomeAux);
- insereRegistro(pLista, codigo, nomeAlocado);
- pLista->qtde++;
- }
- fclose(fp);
- return;
- }
- // insere na lista um registro, cujo código e nome são passados por argumentos
- void insereRegistro(Lista *pLista, long codigo, char *nomeAlocado) {
- // criação/alocação do novo registro
- Registro *novoRegistro;
- novoRegistro = (Registro*)malloc(sizeof(Registro));
- novoRegistro->codigo = codigo;
- strcpy(novoRegistro->nome, nomeAlocado);
- // criação/alocação do novo nó
- No *novoNo;
- novoNo = (No*)malloc(sizeof(No));
- novoNo->info = novoRegistro;
- novoNo->prox = pLista->inicio;
- pLista->inicio = novoNo;
- return;
- }
- // retorna o endereço do registro cujo código é o exato ou o próximo na lista (o imediatamente menor)
- Registro* buscaRegistroAproximado(Lista *pLista, long codigoProcurado) {
- // ponteiro p para percorrer a lista, inicia apontando para o início da lista
- No *p = pLista->inicio;
- int i;
- // percorre toda a lista (exceto o último que será retonado caso não exista um código menor do que o procurado)
- for(i=0; i < pLista->qtde-1; i++) {
- // se o código procurado for menor, continua a busca
- if(codigoProcurado < p->info->codigo) {
- p = p->prox; // faz p apontar para o próximo elemento da lista
- continue;
- }
- // senão, retorna o registro (exato ou aproximado)
- else
- return p->info;
- }
- // se chegou ao fim da lista, retorna o último elemento
- return p->info;
- }
- void exibeTudo(Lista *pLista) {
- // ponteiro p para percorrer a lista, inicia apontando para o início da lista
- No *p = pLista->inicio;
- int i;
- for(i=0; i < pLista->qtde; i++) {
- exibeRegistro(p->info);
- p = p->prox; // faz p apontar para o próximo elemento da lista
- }
- return;
- }
- // exibe apenas um registro
- void exibeRegistro(Registro *registro) {
- printf("\nCodigo: %ld \tNome: %s", registro->codigo, registro->nome);
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement