Jump to content

Imprimir informação de uma lista ligada


Recommended Posts

Posted (edited)

Boa tarde! Estou a desenvolver um programa em C onde tenho de fazer a listagem de todos os clientes existentes numa lista ligada. Inicialmente li todos os clientes de um ficheiro de texto para a lista ligada só que quando vou a imprimir na consola, o programa só estou a imprimir a última data guardada no ficheiro. Se me puderem ajudar, agradecia!

- Ficheiro .txt:
123456789 0 Paulo Silva
555666777 2 Marta Nunes Cabral
4 1 12 12 2017 17 12 2017
5 0 20 04 2018
123123123 3 Maria Pimentel
5 2 01 10 2017 10 10 2017
5 1 13 01 2018 15 01 2018
4 0 17 04 2018
111111111 1 Raquel Marques
3 0 26 05 2018 28 05 2018

 

- Output:

CLIENTES:

123456789 0 Paulo Silva
555666777 2 Marta Nunes Cabral
5 0 20/4/2018 17/12/2017
5 0 20/4/2018 17/12/2017
123123123 3 Maria Pimentel
4 0 17/4/2018 15/1/2018
4 0 17/4/2018 15/1/2018
4 0 17/4/2018 15/1/2018
111111111 1 Raquel Marques
3 0 26/25/2018 15/1/2018

 

struct data_inicio {int dia, mes, ano;};
struct data_entrega {int dia, mes, ano;};

typedef struct aluguer alu, *p_aluguer;
struct aluguer {
    int idGuitarra;
    int estado_aluguer;
    int n_alugueres;
    struct data_inicio d_i;
    struct data_entrega d_e;
    p_aluguer prox;
};

typedef struct cliente cli, *p_cliente;
struct cliente{
    int nif;
    char nomeCliente[ST_TAM];
    struct aluguer a;
    p_cliente prox;
};

/*- CRIAÇÃO DA LISTA LIGADA CLIENTES ----------------------------------------------*/

p_cliente criaLista(char *nomefich){
    p_cliente lista = NULL, novo, aux = lista;
    cli c;
    FILE *f;

    f = fopen(nomefich,"rt");
    if(f == NULL){
        printf("Erro no acesso ao ficheiro.\n");
        return NULL;
    }

    c.prox = NULL;
    while(fscanf(f, "%d %d %49[^\n]", &c.nif , &c.a.n_alugueres, c.nomeCliente) == 3){
            for(int i = 0; i < c.a.n_alugueres; i++){
                fscanf(f, "%d %d %d %d %d", &c.a.idGuitarra, &c.a.estado_aluguer, &c.a.d_i.dia, &c.a.d_i.mes, &c.a.d_i.ano);
                if(fgetc(f) != '\n'){
                    fscanf(f, "%d %d %d\n", &c.a.d_e.dia, &c.a.d_e.mes, &c.a.d_e.ano);
                }
            }
        novo = malloc(sizeof(cli));
        if(novo == NULL){
            printf("Erro na alocaçao de memoria.\n");
            fclose(f);
            return lista;
        }

        *novo = c;
        if(!lista)
            lista=novo;
        else
            aux->prox=novo;
        aux=novo;
    }
    return lista;
}

/*- LISTAGEM DE TODOS OS CLIENTES ATIVOS ------------------------------------------*/

void mostraClientes(p_cliente c){
    printf("\n\nCLIENTES:\n\n");
    while(c != NULL){
        printf("%d %d %s\n", c->nif, c->a.n_alugueres, c->nomeCliente);
        for(int i = 0; i < c->a.n_alugueres; i++){
                printf("%d %d %d/%d/%d ", c->a.idGuitarra, c->a.estado_aluguer, c->a.d_i.dia, c->a.d_i.mes, c->a.d_i.ano);
                printf("%d/%d/%d\n", c->a.d_e.dia, c->a.d_e.mes, c->a.d_e.ano);
                //c = c->prox;
        }
        c = c->prox;
    }
}
Edited by joanacs
Adicionei o output
Posted

na tua estrutura de cliente só tens "lugar" para guardar a informação de um aluger, sendo que da mesma forma, quando estás a ler ou a escrever, estás sempre a escrever ou a gravar na posição única.

da mesma forma que tens uma lista de clientes, deverás ter uma lista de alugueres

IRC : sim, é algo que ainda existe >> #p@p

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.