Ir ao conteúdo
  • Cadastre-se

C Estrutura de Dados - Arvore Binária. Atividade do curso.


Visitante

Posts recomendados

Opa pessoal beleza?

Então estou fazendo um trabalho pro curso de TI e travei na atividade 2 dele.

É a única que falta pra concluir o trabalho alguém pode me ajudar?

Eu já consegui inserir números normais inteiros na arvore binária mais não consigo fazer cadastrar char e exibir na pesquisa. Segue o enunciado.

 

Faça um algoritmo em linguagem C que realiza a busca de um aluno. A busca deve ser realizada utilizando uma estrutura de dados bastante eficiente para esta tarefa de busca. Dentre as estruturas que podem ser empregados estão: árvore binária ou hash. 1. Deve-se armazenar o nome do aluno, seu e-mail e seu ID. Para o armazenamento utilize uma estrutura heterogênea de dados. 2. Não é necessário fazer a leitura dos dados dos dados dos alunos manualmente. Você já pode deixar pré-cadastrado os dados no seu código. Cadastre pelo menos uns 10 contatos de alunos na sua estrutura de dados. Um dos contatos deverá ser o seu próprio nome e o seu ID. 3. Em um menu na tela, peça para o usuário digitar um ID. O programa deverá realizar a busca por este ID na estrutura de dados e, caso localize o ID, deverá mostrar o nome correspondente do aluno e o e-mail deste contato. Caso não localize, uma mensagem de erro deve ser apresentada. 4. Para testar o programa, teste a busca com o seu ID e coloque a captura de dela

Link para o comentário
Compartilhar em outros sites

19 minutos atrás, Siberia55 disse:

Eu já consegui inserir números normais inteiros na arvore binária mais não consigo fazer cadastrar char e exibir na pesquisa

 

🤔 A árvore é apenas um container. Se não programou assim quando inseriu esses números normais volte àquele programa e corrija: A árvore tem elementos, e cada elemento da árvore tem um label, uma identificação, e pode ter um registro associado a esse label. E tem os ponteiros. Se for binária como sabe terá dois deles.

 

Se inseriu esses "números normais inteiros" else poderiam ser apenas uma contagem, e em cada elemento teria um registro com os dados que quer usar.

 

Como você escreveu, cada elemento representa um aluno e deve ter o nome, e-mail e um ID. Apenas junte as coisas.

Link para o comentário
Compartilhar em outros sites

@arfneto entendi a ideia mais ou menos.

 

É que eu estou meio perdido nesta questão dos chars, até fiz a struct normal mas da erro na hora de inserir. Acaba só colocando o ID e no nome/email retorna apenas a última coisa digitada no teclado.

 

não tenho ideia de como "arrumar", alguma dica do que estudar pra ter um exemplo?

 

prazo de entrega é de 2 semanas ainda.

Link para o comentário
Compartilhar em outros sites

7 minutos atrás, Siberia55 disse:

É que eu estou meio perdido nesta questão dos chars, até fiz a struct normal mas da erro na hora de inserir. Acaba só colocando o ID e no nome/email retorna apenas a última coisa digitada no teclado.

 

não tenho ideia de como "arrumar", alguma dica do que estudar pra ter um exemplo?

 

Apenas pense no que te expliquei e no que você já escreveu. Poste o código aqui e alguém pode ajudar. 

 

Não existe a "questão dos chars"

 

Uma árvore é um container. A árvore tem nós, ou folhas, ou galhos ou como queira chamar. Não tem alunos. Não tem "números normais inteiros". Talvez esteja aí sua dificuldade: entender que todas essas estruturas são assim, containers abstratos. Sejam árvores, grafos, listas, pilhas, mapas, conjuntos...

Aparentemente isso não vem sendo ensinado assim. Nem mesmo quando o curso fala em EAD, sendo o A de ABSTRATO...

 

O que tem na Árvore?

 

A árvore binária é um conjunto de nós. Cada nó pode ter um ou dois descendentes. Ou nenhum. Se não tiver nenhum é um nó terminal. Numa árvore binária completa mais da metade deles é terminal, certo? Um nó é a raiz, aquele que não tem "pai".

image.png.5c450e16074cf82121701a29c81ebf7f.png


Uma árvore binária completa, cortesia de http://www.desafiosdeti.com.br/estrutura-de-dados/arvore-binaria-de-busca/

 

(Só pelo desenho) :D tem 3 níveis então tem 2x2X2 - 1 elementos, 2x2 são folhas e tal.

 

 

 

 

Sempre escrevo isso então:
 

Citação

esceva seu código em torno dos dados e não programe uma linha sequer sem uma razão

 

Uma árvore em C
 

typedef struct
{
    char*   nome;
    Node*   raiz;

}   Arvore;

 

Pois é. Nela cabem os seus alunos, os seus números normais inteiros, 🚄🍊, qualquer coisa. Claro que o nome é frescura. :) 

 

A árvore tem nós. Aquelas bolinhas do desenho.
 

O que tem em um nó?

Um label, tag, chave, id, sei lá. O número da bolinha. E ponteiros para os descendentes à esquerda e à direita, ou não vai dar em nada. E se quiser que ela sirva para algo prático, algum dado.

 

Um nó em C
 

typedef struct Folha_
{
    Key     id;
    Dado*   dat;
    struct Folha_* E;
    struct Folha_* D;

}   Node;


Pois é. O mínimo. Entende que o dado pode ser qualquer coisa, ou nada?

 

Use nomes curtinhos para os ponteiros porque vai escrever isso TODA HORA nas funções e não vai querer ficar digitando "esquerda" por exemplo...

 

E id? Na prática muitas vezes é algo que está DENTRO do dado, mas deixando separado fica mais genérico. Pode ser um número de nota fiscal, pode ser uma data, pode ser um valor calculado a partir dos dados, por exemplo o código de uma cidade numa árvore de encomendas, e calculado a partir do conteúdo mas não presente nele, Tanto faz.

 

Com isso já pode (e deve) escrever todas as funções que manipulam a tal árvore. Afinal não quer mais mexer nisso nos próximos programas, certo? 

 

Mas o que podem ser os dados. em C?

 

typedef struct
{
    Key     id;
    char    matricula[8];
    char*   email;
    char*   nome;

}   Dado;

 

Pois é, o tal Aluno. Tem a matrícula, que em geral é um char porque tem dígito verificador. E tem um tal id que pode ser apenas um número. E esse mesmo vai ser usado como chave, porque cada um cria a sua árvore afinal e a gente não quer perder tempo. Entenda que não faz diferença.

 

E que d1@b0 é Key então?

 

Pode ser um número qualquer, sem sinal.

 

typedef unsigned Key;

 

E basta isso?

 

Sim. Isso fecha a conta.

 

Como usar um 🚄 desses?

 

int main(void)
{
    Arvore salgueiro;
    Arvore palmeira[4];

    Arvore* pA = &salgueiro;
    pA = &palmeira[3];

    if ( pA == NULL ) return -1;

    return 0;
}

 

Isso aí declara 5 árvores e um ponteiro, por exemplo. É só isso.

 

O "programa" 
 

Spoiler

#include <stdio.h>

typedef unsigned Key;

typedef struct
{
    Key     id;
    char    matricula[8];
    char*   email;
    char*   nome;

}   Dado;

typedef struct Folha_
{
    Key     id;
    Dado*   dat;
    struct Folha_* E;
    struct Folha_* D;

}   Node;

typedef struct
{
    char*   nome;
    Node*   raiz;

}   Arvore;

 
int main(void)
{
    Arvore salgueiro;
    Arvore palmeira[4];

    Arvore* pA = &salgueiro;
    pA = &palmeira[3];

    if ( pA == NULL ) return -1;

    return 0;
}

 

 

Isso sempre funciona. 

 

Escreva as funções. A primeira é sempre uma função de percurso, porque precisa mostrar o que em lá dentro antes mesmo de por qualquer coisa.

 

 

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