0
When running the code below, we have the following problem, when calling the function imprime_lista, when an element has already been allocated in the list, it is giving segmentation fault. How to solve this?
 #include <stdio.h>
 #include <stdlib.h>
struct No{
int dado;
struct No *prox;
};
typedef struct No No;
struct lista{
struct No *inicio;
struct No *fim;
};
typedef struct lista lista;
//----------- FUNCOES ----------//
lista* cria_lista();
void insere_inicio_lista(lista *li);
void insere_fim_lista(lista *li);
void imprime_lista(lista *li);
void remover_elemento(lista *li);
void esvazia_lista(lista *li);
//---------- MAIN ----------//
int main(){
No *aux;
No *anterior;
lista *li = cria_lista();
imprime_lista(li);
insere_inicio_lista(li);
imprime_lista(li);
return 0;
}
//----------    FUNCOES     ----------//
lista* cria_lista(){
lista* li = (lista*) malloc(sizeof(lista));
if(li != NULL){
    li->fim = NULL;
    li->inicio = NULL;
}
return li;
}
void insere_inicio_lista(lista *li){
No *novo = (No*) malloc(sizeof(No));
scanf("%d", &novo->dado);
if(li->inicio == NULL){
    li->inicio = novo;
    novo->prox = NULL;
    li->fim = novo;
} else {
    novo->prox = li->inicio;
    li->inicio = novo;
}
}
void insere_fim_lista(lista *li){
No *novo = (No*)malloc(sizeof(No));
scanf("%d", &novo->dado);
if(li->inicio == NULL){
    li->inicio = novo;
    novo->prox = NULL;
    li->fim = novo;
} else {
li->fim->prox = novo;
li->fim = novo;
li->fim->prox = NULL;
}
}
void imprime_lista(lista *li){
No *aux;
No *anterior;
if(li->inicio == NULL){
    printf("Lista vazia!!\n");
} else{
    aux = li->inicio;
    do{
        printf((" %d ", aux->dado));
        aux = aux->prox;
    }while(aux != NULL);
}
}
void remover_elemento(lista *li){
No *aux;
No *anterior;
int numero;
int achou;
if(li->inicio == NULL){
    printf("Lista vazia!!\n");
} else {
    printf("Digite o numero a ser removido: ");
    scanf("%d", &numero);
    aux = li->inicio;
    anterior = NULL;
    achou = 0;
    while(aux != NULL){
        if(aux->dado == numero){
            achou++;
            if(aux == li->inicio){
                li->inicio = aux->prox;
                free(aux);
                aux = li->inicio;
            }else if (aux == li->fim){
                anterior->prox = NULL;
                li->fim = anterior;
                free(aux);
                aux == NULL;
            } else {
                anterior->prox = aux->prox;
                free(aux);
                aux = anterior->prox;
            }
        }else{
            anterior = aux;
            aux = aux->prox;
        }
    }
    if(achou == 0){
        printf("Numero nao encontrado\n");
    }else{
        printf("Numero removido %d vez(es)\n", achou);
    }
}
}
void esvazia_lista(lista *li){
No *aux;
No *anterior;
if(li->inicio = NULL){
    printf("Lista vazia!!\n");
}else{
    aux = li->inicio;
    while(aux != NULL){
        li->inicio = li->inicio->prox;
        free(aux);
        aux = li->inicio;
    }
printf("Lista esvaziada!\n");
}
}
						
Thank you Isac! It was very helpful!
– Lucas Katayama