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

4 respostas
M

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;

4 Respostas

J

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;
}
J

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.

M

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

J

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.

Criado 25 de setembro de 2019
Ultima resposta 26 de set. de 2019
Respostas 4
Participantes 2