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.
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
.