Ir ao conteúdo
  • Cadastre-se

C Problema na saída do código


andrelopes0

Posts recomendados

Estou fazendo esse exercício de árvores binárias, e estou com um problema na saída. 

 

Ps: Eu acho que o problema é na função consulta, mas já tentei de tudo que consigo pensar e não consigo resolver. 

Eu sou iniciante :)

 

A saída deveria ser como este exemplo:

 

Entrada

287

7 342 199 201 310 258 287

Saída

V

 

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

struct NO{
    int info;
    struct NO *esq;
    struct NO *dir;
};
typedef struct NO* ArvBin;

ArvBin raiz;

ArvBin cria_ArvBin(){
    ArvBin raiz = (ArvBin*) malloc(sizeof(ArvBin));
    if(raiz != NULL)
        raiz = NULL;
    return raiz;
}

int insere_ArvBin(int valor){
    ArvBin novo;
    novo = (struct NO*) malloc(sizeof(struct NO));
    if(novo==NULL)
        return 0;
    novo-> info = valor;
    novo-> dir = NULL;
    novo-> esq = NULL;

    if(raiz==NULL)
        raiz = novo;
    else{
        ArvBin atual = raiz;
        ArvBin ant = NULL;
        while(atual != NULL){
            ant = atual;
            if(valor == atual->info){
            free(novo);
            return 0;
            }
            if(valor> atual->info)
                atual = atual->dir;
            else
                atual = atual->esq;
        }
        if(valor > ant->info)
            ant->dir = novo;
        else
            ant->esq = novo;
    }
    return 1;
}

void consulta(ArvBin raiz, int num){
    if (raiz!=NULL){
        if(raiz->info == num){
            printf("V\n");
            return;
        }else{
            if(raiz->info < num)
                consulta(raiz->dir, num);
            else
                consulta(raiz->esq, num);
        }
        printf("I\n");
    }
}

ArvBin inicializa (){
    return NULL;
}

int main(){

    int num, n;

    raiz = inicializa();

    scanf("%d", &num);

    while(scanf("%d", &n) != EOF){
        insere_ArvBin(n);
    }
    consulta(raiz,num);
    return 0;

}
 

Link para o comentário
Compartilhar em outros sites

@andrelopes0 quando você declarar uma variável/objeto 'iniciada', significa que ela nunca será NULL por definitivo, portanto em consulta você precisa usar ponteiro:


void consulta(ArvBin *raiz, int num){
...
}

Caso você não use como ponteiro, você simplesmente vai copiar os elementos de 'raiz' para o argumento raiz de consulta. Sem ponteiro você também precisa usar .(ponto) em vez de ->

Link para o comentário
Compartilhar em outros sites

@andrelopes0 Qual o problema com a saída? Se você verificar, ele busca o valor correto depois imprime V, ai quando ele retorna recursivamente, ele acaba imprimindo I. Tente assim:

 

int consulta(ArvBin r, int num){
  if (r!=NULL){

    if(r->info == num){
        printf("V\n");
        return 0;
      }else{
        if(r->info < num)
        	num = consulta(r->dir, num);
        else
        	num = consulta(r->esq, num);
        if(num != 0){
        	printf("I\n");	
      	}
    }
  }
}

 

Link para o comentário
Compartilhar em outros sites

@TYSQUARE89 Só está funcionando para o V. Vou te mostra o enunciado do problema, pra você entender, eu não expliquei bem lá em cima.

 

Suponha que se queira pesquisar a chave 287 em uma arvore binária de pesquisa com chaves entre 1 e 1000. Durante uma pesquisa como essa, uma sequencia de chaves é examinada. Cada sequéncia abaixo é uma  suposta sequencia de chaves examinadas em uma busca da chave 287.

 

1. 7, 342, 199, 201, 310, 258, 287

2. 110, 132, 133, 156, 289, 288, 287

3. 252, 266, 271, 294, 295, 289, 287

4. 715, 112, 530, 249, 406, 234, 287

 

Caso voce desenhe a arvore binária de pesquisa relativa a cada item acima, verá que apenas as duas primeiras sequencias serão válidas. Crie um programa que construa uma arvore binaria de pesquisa através de inserções da sequência de chaves dada, realize uma busca por uma chave específica, e a partir dos dados da busca diga se a sequencia de chaves dada é válida ou não.

 

Entrada

 

A primeira linha contem a chave a ser procurada. A segunda contem sequencia de chaves separadas por espaço a ser examinada.

 

Saída

 

voce deverá imprimir V quando a sequencia for válida e I quando a sequéncia for inválida.

Link para o comentário
Compartilhar em outros sites

@andrelopes0 De acordo com seu código, se você digitar as linhas:

287

715 112 530 249 406 234 287

 

Então a ordem de procura, será assim:

1. 287 == num > V

2. 112 != num >  I

3. 530 != num >  I

4. 249 != num >  I

5. 406 != num >  I

6. 234 != num >  I

7. 287 != num >  I

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...