feholy
(usa Outra)
Enviado em 19/06/2016 - 16:43h
Preciso inserir uma lista automatica em uma arvore binaria e imprimi-la. estou com um pouco de dificuldade ja que nao domino muito a função rand
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
struct Arvore
{
int matricula;
char nome[100];
char curso[100];
struct Arvore *esq, *dir;
};
typedef struct Arvore *pArvore;
//variavel para a raiz da arvore
pArvore raiz = NULL;
//prototipação da função
void Inserir(pArvore *p, int x);
int Remover(pArvore *p, int x);
pArvore maior(pArvore *p);
pArvore Buscar(pArvore p, int x);
//essa funcao ira fazer de forma recursiva a inclusao
void Inserir(pArvore *p, int x)
{
// procura se a arvore esta vazia
if((*p) == NULL)
{
*p = (pArvore)malloc(sizeof(struct Arvore));
(*p)->esq=NULL;
(*p)->dir=NULL;
(*p)->matricula=x;
}
else
{
if(x <((*p)->matricula))
//função recursiva se o numero for menor do que o numero da raiz
Inserir(&((*p)->esq), x);
else
//função recursiva se o numero for maior do que o numero da raiz
Inserir(&((*p)->dir), x);
}
}
int Remover(pArvore *p, int x)
{
if(*p == NULL)
//verifica se a arvore esta vazia
return 1;
else {
pArvore aux = *p;
if((*p)->matricula == x) //achou o elemento
{//apenas o subno da direita
if((*p)->esq ==NULL){
*p = (*p)->dir;
free(aux);
}
else
//apenas quando tem o subno da esquerda
if((*p)->dir==NULL){
*p = (*p)->esq;
free(aux);
}else{
//quando possui dois subnos, chama a função maior
aux = maior(&((*p)->dir));
free(aux);
}
}else{
if(x < (*p)->matricula)
return Remover(&((*p)->esq), x);
else
return Remover(&((*p)->dir), x);
}
return 0; //retorna 0 caso tenha tido sucesso ao remover o elemento
}
}
pArvore maior(pArvore *p){
pArvore aux = *p;
if(aux->esq==NULL){
*p = (*p)->dir;
return aux;
}
else{
return maior(&((*p)->esq));
}
}
void randomiza(pArvore *p, int x)
{
int i;
srand(time(NULL));
if(*p == NULL)
return 1;
else{
i = rand() % 100;
return 0;}
}
//Procura um elemento na arvore
pArvore Buscar(pArvore p, int x){
if(p==NULL)return 0;
else{
if(p->matricula == x) return p->matricula;
else{
if(x < p->matricula)
return Buscar(p->esq, x);
else
return Buscar(p->dir, x);
}
}
}
int imprime_insere(pArvore *p, int x)
{
int i;
if(*p == NULL)
return 1;
else{
printf("%d\n", *p);
return 0;
}
}
int main(void){
char opcao;
int x, aux;
clock_t inicio,fim;
double time_insere=0,time_remove=0,time_Busca=0;
do{
printf("==============================\n");
printf("||===== Arvore Binaria =====||\n");
printf("||==========================||\n");
printf("||=== O que deseja fazer? ==||\n");
printf("||= (1) Inserir um novo no =||\n");
printf("||= (2) Remover um no ======||\n");
printf("||= (3) Buscar um no =======||\n");
printf("==============================\n");
scanf("%d",&opcao);
if(opcao<1||opcao>3);{
exit(1);
}
switch(opcao){
case 1:
randomiza(&raiz, x);
inicio=clock();
Inserir(&raiz, x);
fim=clock();
time_insere = ((double)(fim-inicio))/CLK_TCK;
imprime_insere(&raiz, x);
break;
case 2:
randomiza(&raiz, x);
inicio=clock();
Remover(&raiz, x);
fim=clock();
time_remove = ((double)(fim-inicio))/CLK_TCK;
case 3:
randomiza(&raiz, x);
inicio=clock();
Busca(&raiz, x);
fim=clock();
time_Busca = ((double)(fim-inicio))/CLK_TCK;
}
}while(opcao>0||opcao<3);
return 0;
}