Estrutura Fila, erro segmentation default na função posição

quando chamo a função posicao com um numero que não está na lista ele não retorna o printf("%d não esta na lista\n", v);
Alguém sabe qual o erro no código
?

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

typedef struct lista {
int info;
struct lista* prox;
} Lista;
typedef struct fila {
Lista* frente;
Lista* fundo;
} Fila;

Fila* cria() {
Fila* fila = ( Fila* ) malloc ( sizeof( Fila ) );
fila -> frente = NULL;
fila -> fundo = NULL;
return fila;
}

int fila_vazia( Fila* f ) {
if( f == NULL ){
return 1;
}
return(f -> frente == NULL );
}

void inserir( Fila * f , int v ) {
Lista* novo = ( Lista *) malloc ( sizeof( Lista ) );
novo -> info = v ;
novo -> prox = NULL;
if( fila_vazia ( f ) ){
f -> frente = novo;
}
else{
f -> fundo -> prox = novo;
}
f -> fundo = novo;
}

void posicao( Fila* f, int v ){
if( fila_vazia ( f ) ) {
printf ("\nfila vazia!\n");
return;
}
Lista* l;
int i = 1;
for( l = f -> frente ; (l -> info != v) && (l != NULL) ; l = l -> prox ){
i++;
}
if(l != NULL){
printf(“posicao de %d na lista eh: %d\n”, v, i-1);
return;
}
else{
printf("%d nao esta na lista\n", v);
return;
}
}

int main()
{
Fila* f = cria ();
int i,j,k;
i = 1;
j = 2;
k = 3;
inserir( f, i );
inserir( f, j );
inserir( f, k );

posicao( f, 4 );

return 0;

Melhorando a legibilidade…

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

typedef struct lista {
	int info;
	struct lista* prox;
} Lista;

typedef struct fila {
	Lista* frente;
	Lista* fundo;
} Fila;

Fila* cria() {
	Fila* fila = ( Fila* ) malloc ( sizeof( Fila ));
	fila -> frente = NULL;
	fila -> fundo = NULL;
	return fila;
}

int fila_vazia( Fila* f ) {
	if( f == NULL ){
		return 1;
	}
	return(f -> frente == NULL );
}

void inserir( Fila * f , int v ) {
	Lista* novo = ( Lista *) malloc ( sizeof( Lista ) );
	novo -> info = v ;
	novo -> prox = NULL;
	
	if( fila_vazia ( f ) ){
		f -> frente = novo;
		
	}else{
		f -> fundo -> prox = novo;
	}
	f -> fundo = novo;
}

void posicao( Fila* f, int v ){
	if( fila_vazia ( f )){
		printf ("\nfila vazia!\n");
		return;
	}
	Lista* l;
	int i = 1;
	for( l = f -> frente ; (l -> info != v) && (l != NULL) ; l = l -> prox){
		i++;
	}
	if(l != NULL){
		printf(“posicao de %d na lista eh: %d\n”, v, i-1);
		return;
		
	}else{
		printf("%d nao esta na lista\n", v);
		return;
	}
}

int main(){
	Fila* f = cria ();
	int i,j,k;
	i = 1;
	j = 2;
	k = 3;
	inserir( f, i );
	inserir( f, j );
	inserir( f, k );

	posicao( f, 4 );

	return 0;
}
1 curtida

Lista* l; //declaração de um ponteiro

Não encontrei o lugar onde você atribui um valor a esse ponteiro. Logo, ao meu ver, l vale NULL e por isso cai no else.

l recebe f -> frente no for, o erro é que mesmo l sendo NULL ele não retorna o printf do else
Dá erro quando chega no else

Eu testei aqui. Depois do for, l aponta para 00000000 que equivale a NULL.

Veja o teste:

void posicao( Fila* f, int v ){
	if( fila_vazia(f)){
		printf ("\nfila vazia!\n");
		return;
	}
	Lista* l;
	printf("*Antes do for* %p\n", l);
	int i = 1;

	for(l = f->frente; (l != NULL) && (l->info != v) ; l = l->prox){
		i++;
	}

	printf("*Depois do for* %p\n", l);
	if(l != NULL){
		printf("posicao de %d na lista eh: %d\n", v, i-1);
		return;

	}else{
		printf("%d nao esta na lista\n", v);
		return;
	}
}

Obs.: troquei a ordem da expressão de teste. Pois como 4 nunca é encontrado, então, quando prox = NULL, NULL->info dá erro.

image

No entanto você estava certo sobre a inicialização no for. Contudo,l = l ->prox aponta para NULL quando chegar ao último item da lista, como você pode comprovar aqui:

novo -> prox = NULL;

Isso ocorre porque quando o valor do for for 3, l irá receber o próximo que é NULL e o laço será finalizado, pois não passa no teste do próximo laço, mas já foi atribuído NULL a l mesmo assim. Logo, ao testar se l != NULL não passa e cai no else.