When running the code below, we have the following problem, when calling the imprime_lista
function, when an element has already been allocated in the list, is giving segmentation fault
. How do I resolve 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");
}
}