List does not print in C

Asked

Viewed 52 times

0

My code is compiling, but why doesn’t my list print?

Code:

#include<stdio.h>
#include<stdlib.h>
struct numeros{
    int num;
};
typedef struct elemento* Lista;
Lista* cria_lista();
void libera_lista(Lista* li);
int tamanho_lista(Lista* li);
int lista_vazia(Lista* li);
int menu();
void opcao(int op, Lista *li);
int insere_lista_inicio(Lista* li);
int insere_lista_final(Lista *li);
int usuario();
void imprimir(Lista *li);

struct elemento{
  struct numeros dados;
  struct elemento *prox;
};
typedef struct elemento Elem;
Lista* cria_lista(){
Lista* li=(Lista*)malloc(sizeof(Lista));
if(li != NULL)
    *li=NULL;
return li;
}
void libera_lista(Lista* li){
    if(li!=NULL)
    {
        Elem* no;
        while((*li) != NULL)
        {
            no=*li;
            *li=(*li)->prox;
            free(no);
        }
    }
}
int tamanho_lista(Lista* li)
{
    if(li != NULL) return 0;
    int cont = 0;
    Elem* no = *li;
    while(no != NULL)
    {
        cont++;
        no=no->prox;
    }
    return cont;
}
int lista_vazia(Lista* li){
    if(li!=NULL)
        return 1;
    if(li!=NULL)
        return 1;
    return 0;
}
int menu()
{
    int opc;
    printf("[ 0 ] INSERIR NUMERO NO INICIO\n");
    printf("[ 1 ] INSERIR NUMERO NO FIM   \n");
    printf("[ 2 ] MOSTRAR LISTA           \n");
    printf("[ 3 ] LIMPAR LISTA            \n");
    printf("[ 4 ] SAIR DO PROGRAMA        ");
    scanf("%d", &opc);
    return opc;
}
void opcao(int op, Lista *li)
{
    switch(op)
    {
        case 0:
            insere_lista_inicio(li);
            break;
        case 1:
            insere_lista_final(li);
            break;
        case 2:
            imprimir(li);
            break;
        case 3:
            libera_lista(li);
            break;
        case 4:
                printf("Fim ;P!");
            break;
        default:
            printf("Não existe essa opcao!");
    }
}
 int insere_lista_inicio(Lista* li){
    int num=usuario();
    if(li==NULL) return 0;
    Elem* no=(Elem*)malloc(sizeof(Elem));
    if(no == NULL) return 0;
    no->dados.num=num;
    no-> prox=(*li);
    *li=no;
    return 1;
}
int insere_lista_final(Lista* li)
{
    int num=usuario();
    if(li == NULL) return 0;
    Elem *no =(Elem *)malloc(sizeof(Elem));
    if(no== NULL) return 0;
    no->dados.num=num;
    no->prox=NULL;
    if(*li == 0)
        *li=no;
    else{
        Elem *aux = *li;
        while (aux->prox !=NULL)
        {
            aux=aux->prox;
        }
        aux->prox=no;
    }
    return 1;
}
void imprimir(Lista *li)
{
    struct numeros nu;
    int n;
    if(li ==NULL)
        exit (1);
    Elem *no=*li;
    while(no->prox!=NULL)
    {
        nu=no->dados;
        printf("%d ", nu.num);
        no=no->prox;
    }
}
int usuario()
{
    int num;
    printf("Digite um numero: ");
    scanf("%d", &num);
    return num;
}
int main()
{   struct numeros novo;
    int opc;
    do{
    Lista *li=cria_lista();
    opc=menu();
    opcao(opc,li);
    }while(opc!=5);
}

I’m pretty sure it’s because I can’t access it the way I’m accessing it.

That code itself is fine for me, but I can’t fix it.

1 answer

1


I won’t comment on the other errors in your code (if any) as I haven’t tested it. So I focus here specifically on the problem reported:

my list doesn’t want to print

First you are recreating the list with each iteration in your main, and should be:

Lista *li=cria_lista();
do{
   opc=menu();
   opcao(opc,li);
}while(opc!=5);

Then in the iteration of your imprimir the condition is wrong, and will print one less, so it should be:

Elem *no=*li;
while(no!=NULL)
{
    nu=no->dados;
    printf("%d ", nu.num);
    no=no->prox;
}

Browser other questions tagged

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