Estou com um trabalho de Estrutura de dados II para ser entregue, e minha remoçao não esta funcionando, já fiz ela inumeras vezes e nada de dar certo, todo o resto esta funcionando perfeitamente, alguém poderia dar uma dica do que estou fazendo errado? segue o meu codigo
#include <stdio.h>
#include <stdlib.h>
#define N 100
typedef struct arvore{
int bal;//armazena o fator de balançeamento
int isbn;//armazena a isbn do livro
char titulo[100];//armazena o titulo do livro
char autor[100];//armazena o autor do livro
int n_livros;//armazena a quantidade de livros
struct arvore *esq;//aponta para o filho esquerdo da raiz
struct arvore *dir;//aponta para o filho direito da raiz
}AVL;
//Inicio Prototipos
void primeiro_caso_avl(AVL **pt);
void segundo_caso_avl(AVL **pt);
int insere_avl(AVL **pt,int x);
AVL *aloca_no(int x);
void percurso_ordem(AVL *pt);
void percurso_pos_ordem(AVL *pt);
void remove_avl(AVL **pt,AVL **ptAux,int x);
int busca_avl(AVL *pt, int x);
void busca_remove_elemento_dir_AVL(AVL **pt,AVL **raiz,AVL **ptAux);
//Fim Prototipos
int h=0;//Variavel global de auxilio
int main(){
AVL *arvore = NULL;//criar a arvore e inicializa com nulo
int condicao,x;//variaveis
do{
system("cls");
printf("Escolha a opcao desejada:\n\n");
printf("[1]Imprimir lista de livro ordem crescente\n");
printf("[2]Inserir novo livro\n");
printf("[3]Buscar livro no sistema\n");
printf("[4]Imprimir estrutura da arvore\n");
printf("[5]Excluir livro\n");
printf("[0]Para Sair\n");
scanf("%i",&condicao);
switch(condicao){
case 0://Sair do programa
printf("Finalizado");
system("pause");
return 0;
break;
case 1://Imprimir lista de livro ordem crescente
percurso_ordem(arvore);//usa-se percurso em ordem para imprimir ordenadamente e em forma crescente
system("pause");
break;
case 2://Inserir novo livro
printf("\nDigite ISBN: ");
scanf("%i",&x);
insere_avl(&arvore,x);
break;
case 3://Buscar livro no sistema
printf("\nDigite numero a ser buscado:");
scanf("%i",&x);
busca_avl(arvore,x);
system("pause");
break;
case 4://Imprimir estrutura da arvore
percurso_pos_ordem(arvore);
system("pause");
break;
case 5://Excluir
printf("\nExcluir numero: ");
scanf("%i",&x);
remove_avl(&arvore,&arvore,x);
system("pause");
break;
}
}while(condicao != 0);
}
AVL *aloca_no(int x){//alocamos e já inicializamos todos os dados
AVL *novo;
novo=(AVL *)malloc(sizeof(AVL));
novo->bal=0;
novo->isbn=x;
novo->esq=NULL;
novo->dir=NULL;
printf("\nDigite o Titulo:");
fflush(stdin);
fgets(novo->titulo,100,stdin);
printf("\nDigite o nome dos Autor(es):");
fflush(stdin);
fgets(novo->autor,100,stdin);
printf("\nDigite numero de livros:");
scanf("%i",&novo->n_livros);
return novo;
}
int insere_avl(AVL **pt, int x){
if(*pt == NULL){
*pt = aloca_no(x);
h=1;
}
else{
if(x == (*pt)->isbn){
printf("Chave existente\n\n");
return 0;
}
else{
if(x < (*pt)->isbn){
insere_avl(&(*pt)->esq,x);
if(h==1){
switch((*pt)->bal){
case -1:
(*pt)->bal=0;
h=0;
break;
case 0:
(*pt)->bal=1;
break;
case 1:
primeiro_caso_avl(&(*pt));
break;
}
}
}
else{
insere_avl(&(*pt)->dir,x);
if(h==1){
switch((*pt)->bal){
case 1:
(*pt)->bal=0;
h=0;
break;
case 0:
(*pt)->bal=-1;
break;
case -1:
segundo_caso_avl(&(*pt));
break;
}
}
}
}
}
}
void primeiro_caso_avl(AVL **pt){
AVL *ptu,*ptv;
ptu = (*pt)->esq;
if(ptu->bal == 1){//Altura(Te(u)) > Altura(Td(u))
(*pt)->esq = ptu->dir;//rotacao a direita
ptu->dir = *pt;
(*pt)->bal = 0;
*pt = ptu;
}
else{ //Alt(Te(u)) < Alt(Td(u))
ptv = ptu->dir;//rotacao dupla a direita
ptu->dir = ptv->esq;
ptv->esq = ptu;
(*pt)->esq = ptv->dir;
ptv->dir = *pt;
if(ptv->bal=1){//atualizacao do fator de balanceamento
(*pt)->bal = -1;
}
else{
(*pt)->bal = 0;
}
if(ptu->bal = -1){
ptu->bal = 1;
}
else{
ptu->bal = 0;
}
*pt=ptv;
}
(*pt)->bal = 0;
h=0;
}
void segundo_caso_avl(AVL **pt){
AVL *ptu,*ptv;
ptu = (*pt)->dir;
if(ptu->bal=-1){//rotacao a esquerda
(*pt)->dir = ptu->esq;
ptu->esq = *pt;
(*pt)->bal=0;
*pt = ptu;
}
else{//rotacao dupla esquerda
ptv = ptu->esq;
ptu->esq = ptv->dir;
ptv->dir=ptu;
(*pt)->dir=ptv->esq;
ptv->esq=*pt;
if(ptv->bal=-1){//atualizacao do fator de balanceamento
(*pt)->bal=1;
}
else{
(*pt)->bal=0;
}
if(ptv->bal=1){
ptu->bal=-1;
}
else{
ptu->bal=0;
}
*pt=ptv;
}
(*pt)->bal=0;
h=0;
}
int busca_avl(AVL *pt, int x){
if(pt != NULL ){
while (pt != NULL){
if(pt->isbn < x){
pt = pt->dir;
}
else if (pt->isbn > x){
pt = pt->esq;
}
else if(pt->isbn == x){
printf("Elemento encontrado");
return 1;
}
else{
printf("Elemento não encontrado");
return 0;
}
}
}
}
void percurso_ordem(AVL *pt){
if(pt != NULL){
percurso_ordem(pt->esq);
printf("\nISBN = %i\nTitulo = %sAutor = %sNumero = %i\n",pt->isbn, pt->titulo, pt->autor, pt->n_livros);
percurso_ordem(pt->dir);
}
}
void percurso_pos_ordem(AVL *pt){
if(pt != NULL){
percurso_pos_ordem(pt->esq);
percurso_pos_ordem(pt->dir);
printf("\nISBN = %i\nBalanceamento = %i\n",pt->isbn, pt->bal);
}
}
void busca_remove_elemento_dir_AVL(AVL **pt,AVL **raiz,AVL **ptAux){ //remove elemento esquerdo mais à direita
AVL *remove;
if((*pt)->dir != NULL){
busca_remove_elemento_dir_AVL(&(*pt)->dir,&(*raiz),&(*pt));
if(h==1){
segundo_caso_avl(&(*pt));
}
}
else{
remove = *pt;
(*raiz)->isbn = (*pt)->isbn;
*pt = (*pt)->esq;
if(*pt != NULL){
(*ptAux)->esq = *pt;
}
(*raiz)->bal=-1;
h = 1;
free(remove);
}
}
void remove_avl(AVL **pt,AVL **ptAux,int x){
if(*pt == NULL){
printf("Numero não Encontrado");
h=0;
}
else{
if((*pt)->isbn > x){
remove_avl(&(*pt)->esq,&(*pt),x);
if(h==1){
switch((*pt)->bal){
case 1:
(*pt)->bal=0;
h=0;
break;
case 0:
(*pt)->bal=-1;
break;
case -1:
segundo_caso_avl(&(*pt));
break;
}
}
}
else{
if((*pt)->isbn < x){
remove_avl(&(*pt)->dir,&(*pt),x);
if(h==1){
switch((*pt)->bal){
case -1:
(*pt)->bal=0;
h=0;
break;
case 0:
(*pt)->bal=-1;
break;
case 1:
primeiro_caso_avl(&(*pt));
break;
}
}
}
else{//elemento a ser removido
if((*pt)->dir == NULL){
if((*pt)->esq != NULL){
(*ptAux)->dir = (*pt)->esq;
}
h=1;
}
else{
if((*pt)->esq == NULL){
if((*pt)->dir != NULL){
(*ptAux)->esq = (*pt)->dir;
}
*pt = (*pt)->dir;
h=1;
}
else{
busca_remove_elemento_dir_AVL(&(*pt)->esq,&(*pt),&(*pt));
if(h==1){
segundo_caso_avl(&(*pt));
}
}
}
}
}
}
}
Pergunta
FernandoIuasse
Estou com um trabalho de Estrutura de dados II para ser entregue, e minha remoçao não esta funcionando, já fiz ela inumeras vezes e nada de dar certo, todo o resto esta funcionando perfeitamente, alguém poderia dar uma dica do que estou fazendo errado? segue o meu codigo
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.