Problem displaying list

0

I'm using static type list, and when I try to display it, it shows only the first student of the 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;
}
    
asked by anonymous 12.12.2016 / 16:23

1 answer

1

There are several errors in the code. This 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);
}

See running on ideone .

I gave an organized one, changed some names wrong, other problems that prevented the compilation, made a copy of the data that was not being made and I even hit the loop to open space at the top of the list. There are still some improvements that need to be made.

    
12.12.2016 / 19:56