Problem when displaying list

Asked

Viewed 107 times

-2

I’m using the static type list, and when I try to display it, it just shows the first student of registered.

#include <stdio.h>
#include <stdlib.h>

#define MAX 12

typedef struct Alunos alunos;
typedef struct Lista lista;

struct Alunos {
    char nome[40];
    int idade;
};

struct Lista {
    int qnt;
    alunos dados[MAX];

};

lista* cria(){
    lista *l = malloc(sizeof(lista));
    if(l != NULL)
        l->qnt = 0;
        return l;
}

int insere(lista *l, alunos al) { //insere no inicio

    if(l == NULL)
        return 0;
    if(l->qnt == MAX)
        return 0;
    for(int i=0; i<l->qnt - 1; i++)
        l->dados[i] = l->dados[i + 1];
        l->dados[0] = al;
        l->qnt++;
    return 1;
}

void liberar(lista *l) {
    free(l);
}

void exibe(lista *l) {
    if(l->qnt == 0)
        printf("\nLista esta vazia.\n\n");

    for(int i=0; i<l->qnt; i++) {
        printf("Aluno: %s", l->dados[i].nome);
        printf(", de Idade: %d\n", l->dados[i].idade);
    }
}

void menu(int opcao, lista *l, alunos al) {

    do{
    printf("\tEscolha uma Opcao\n");
    printf("O: sair\n");
    printf("1: Cadastrar Aluno\n");
    printf("2: Exibir Alunos\n");
    printf("Opcao: ");
    scanf("%d", &opcao);
    switch(opcao) {
    case 0:
        break;
    case 1:
        printf("\nDigite o nome: ");
        scanf("%s", &al.nome);
        printf("Digite a idade: ");
        scanf("%d", &al.idade);
        insere(l, al);
        system("cls");
        break;
    case 2:
        exibe(l);
        break;
    default:
        printf("Opcao Invalida.\n");
        break;
      }
    } while(opcao != 0);
    liberar(l);
}
int main()
{
    lista *l = cria();
    alunos al;
    int opc;
    menu(opc, l, al);
    return 0;
}

1 answer

1

There are several errors in the code. This is how it works

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 12

typedef struct aluno {
    char nome[40];
    int idade;
} Aluno;

typedef struct lista {
    size_t qnt;
    Aluno dados[MAX];
} Lista;

Lista* cria() {
    Lista *l = malloc(sizeof(Lista));
    if (l != NULL)
        l->qnt = 0;
        return l;
}

int insere(Lista *l, Aluno al) { //insere no inicio
    if (l == NULL) return 0;
    if (l->qnt == MAX) return 0;
    for (int  i = l->qnt; i > 0; i--) l->dados[i] = l->dados[i - 1];
    memcpy(&l->dados[0], &al, sizeof(Aluno));
    l->qnt++;
    return 1;
}

void liberar(Lista *l) {
    free(l);
}

void exibe(Lista *l) {
    if (l->qnt == 0) printf("\nLista esta vazia.\n\n");
    for (int i = 0; i < l->qnt; i++) {
        printf("Aluno: %s", l->dados[i].nome);
        printf(", de Idade: %d\n", l->dados[i].idade);
    }
}

int main() {
    Lista *l = cria();
    Aluno al;
    int opc;
    do {
        printf("\tEscolha uma Opcao\n");
        printf("O: sair\n");
        printf("1: Cadastrar Aluno\n");
        printf("2: Exibir Alunos\n");
        printf("Opcao: ");
        scanf("%d", &opc);
        switch(opc) {
        case 0:
            break;
        case 1: //inconsistência
            printf("\nDigite o nome: ");
            scanf("%s", al.nome);
            printf("Digite a idade: ");
            scanf("%d", &al.idade);
            insere(l, al);
            system("cls");
            break;
        case 2:
            exibe(l);
            break;
        default:
            printf("Opcao Invalida.\n");
            break;
        }
    } while (opc != 0);
    liberar(l);
}

Behold working in the ideone. And in the repl it.. Also put on the Github for future reference.

I gave an organized, changed some wrong names, other problems that prevented the compilation, I made a copy of the data that was not being made and I still hit the noose to make room at the top of the list. There are still improvements to be made.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.