Ir ao conteúdo
  • Cadastre-se

HeadCrrusher

Membro Júnior
  • Posts

    7
  • Cadastrado em

  • Última visita

Reputação

0
  1. Olá! Fiz um programa onde tenho uma árvore AVL que sempre que um Nó é inserido, verifico se é necessário fazer o Balanceamento. Até aí está funcionando. Agora estou com dificuldades tentando fazer esse balanceamento após a remoção de um nó. Vou colocar aqui o código dos métodos de remoção do nó e de balanceamento: Preciso bastante dessa ajuda, 'luz', etc, galera Obrigado. protected No remover(int x, No t) { if(t == null) throw new RuntimeException("Valor não encontrado"); else if(x < t.valor) t.left = remover(x,t.left); else if(x > t.valor) t.right = remover(x,t.right); else if(t.left != null && t.right != null ) { No auxiliar = t.right; while(auxiliar.left != null) auxiliar = auxiliar.left; t.valor = auxiliar.valor; t.right = removeMin(t.right); } else t = ( t.left != null ) ? t.left : t.right; return t; } protected No balanceamento(No aux) { int d, df; d = aux.altd - aux.alte; if (d == 2) { df = aux.right.altd - aux.right.alte; if (df >= 0) { aux = rotacao_esquerda(aux); } else { aux.right = rotacao_direita(aux.right); aux = rotacao_esquerda(aux); } } else if (d == -2) { df = aux.left.altd - aux.left.alte; if (df <= 0) { aux = rotacao_direita(aux); } else { aux.left = rotacao_esquerda(aux.left); aux = rotacao_direita(aux); } } return aux; }
  2. Isso! It's alive! Funcionou, cara! Muito obrigado novamente! Vou deixar aqui o código completo pra ajudar futuras pessoas que tenham a mesma dúvida: #include <stdio.h>#include <stdlib.h>struct Item{ int numero; struct Item *proximo;};void Inicializar(Item **topo){ *topo = NULL;}bool EstaVazia(Item **topo){ if(*topo == NULL) return true; else return false;}void Empilhar(Item **topo, int elemento){ Item *novo; novo = (Item *)malloc(sizeof(Item)); novo->numero = elemento; novo->proximo = *topo; // -> próximo recebe o elemento que estava no topo. NA topo *topo = novo;}int Desempilhar(Item **topo){ int result; Item *auxiliar; if(EstaVazia(topo)) { printf("\n stack underflow! \n"); exit(1); } else { result = (*topo)->numero; auxiliar = *topo; *topo = (*topo)->proximo; free(auxiliar); return result; }}int DesempilharInversamente(Item **topo){ Item* it = NULL; Item* auxiliar = NULL; int result = -1; for (it = (*topo); it->proximo != NULL; it = it->proximo) if (it->proximo->proximo == NULL) break; auxiliar = it->proximo; if (auxiliar) { result = it->proximo->numero; it->proximo = NULL; free(auxiliar); } else { result = it->numero; free(it); *topo = NULL; } return result;}void MostrarPilha(Item *topo){ int i = 0; Item *item; printf("\n\n Listando...\n\n"); printf("---------------------------------\n"); if (EstaVazia(&topo)) { printf ("A Pilha esta vazia!\n"); } else { item = topo; while(item != NULL) { i++; printf("[%i] -> %i\n", i, item->numero); item = item->proximo; } } printf("---------------------------------\n");}void Menu(){ printf( "\n\nDigite a sua escolha: \n" " 1 empilhar elemento \n" " 2 desempilhar \n" " 3 desempilhar Inversamente \n" " 4 para finalizar \n" "? ");}main(){ Item *topo = NULL; int opcao; int numero; Menu(); scanf("%i", &opcao); while (opcao != 4) { switch (opcao) { case 1: printf( "Digite um numero: "); scanf("\n%i", &numero); Empilhar(&topo, numero); MostrarPilha(topo); break; case 2: numero = Desempilhar(&topo); printf( "\n Numero desempilhado: %d \n",numero); MostrarPilha(topo); break; case 3:numero = DesempilharInversamente(&topo);printf( "\n Numero desempilhado: %d \n",numero); MostrarPilha(topo);break; default: printf( "Escolha invalida.\n\n"); break; } Menu(); scanf("%i", &opcao); } system("pause");} Mais uma vez, obrigado @Nayuugga pela sua ajuda e tempo! Abraços!
  3. Infelizmente essa linha de código não serviu. Mas testando aqui notei que quando sobra esse último Número, eu consigo tirá-lo da pilha normalmente executando a opção número 2 (o Desempilhar normal). Será que não falta algum tipo de referência no DesempilharInversamente para esse último número para ele ser apagado?
  4. Olá, novamente! Amigo, gostaria de agradecer você pois o seu código funcionou muito bem!!! Foi de enorme ajuda! Está sem nenhum erro porém, quando chega a hora de retirar o último número da pilha, o mesmo não é retirado. Será que você pode me ajudar mais um pouco?! Segue uma foto: Eu escolho a opção 3, ele desempilha de baixo para cima corretamente, mas quando chega no último número (no topo; no caso da foto, o 50) ele não elimina o número e exibe a "Pilha está vazia!", além de continuar exibindo em cima o "Numero desempilhado: 50". Fico no aguardo, enquanto isso vou tentando aqui. Mais uma vez, obrigado!
  5. Obrigado, amigo! Vou testar o código aqui e já já te passo um feedback! ;D
  6. Olá! Fiz uma pilha que cumpre a sua função Desempilhar normalmente, de cima para baixo. Agora estou tentando desempilhar essa mesma pilha só que de Baixo para Cima mas estou com dificuldades e gostaria da ajuda dos senhores. Agradeço desde já! Segue o Código: #include <stdio.h>#include <stdlib.h>struct Item{ int numero; struct Item *proximo;};void Inicializar(Item **topo){ *topo = NULL;}bool EstaVazia(Item **topo){ if(*topo == NULL) return true; else return false;}void Empilhar(Item **topo, int elemento){ Item *novo; novo = (Item *)malloc(sizeof(Item)); novo->numero = elemento; novo->proximo = *topo; // -> próximo recebe o elemento que estava no topo. *topo = novo;}int Desempilhar(Item **topo){ int result; Item *auxiliar; if(EstaVazia(topo)) { printf("\n stack underflow! \n"); exit(1); } else // -> Elemento retirado do topo { result = (*topo)->numero; auxiliar = *topo; *topo = (*topo)->proximo; free(auxiliar); return result; }}void MostrarPilha(Item *topo){ int i = 0; Item *item; printf("\n\n Listando...\n\n"); printf("---------------------------------\n"); if (EstaVazia(&topo)) { printf ("A Pilha esta vazia!\n"); } else { item = topo; while(item != NULL) { i++; printf("[%i] -> %i\n", i, item->numero); item = item->proximo; } } printf("---------------------------------\n");}void Menu(){ printf( "\n\nDigite a sua escolha: \n" " 1 empilhar elemento \n" " 2 desempilhar \n" " 3 para finalizar \n" "? ");}main(){ Item *topo = NULL; int opcao; int numero; Menu(); scanf("%i", &opcao); while (opcao != 3) { switch (opcao) { case 1: printf( "Digite um numero: "); scanf("\n%i", &numero); Empilhar(&topo, numero); MostrarPilha(topo); break; case 2: numero = Desempilhar(&topo); printf( "\n Numero desempilhado: %d \n",numero); MostrarPilha(topo); break; default: printf( "Escolha invalida.\n\n"); break; } Menu(); scanf("%i", &opcao); } system("pause");}

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