Ir ao conteúdo
  • Cadastre-se

Marcos Aurélio Alves Caval

Membro Júnior
  • Posts

    3
  • Cadastrado em

  • Última visita

Reputação

1
  1. //IMPLEMENTAÇÃO DE ÁRVORE BINÁRIA AVL /* prótotipos das funções; tipo de dado armazenado na árvore; o ponteiro "árvore". */ typedef struct{ int chave; }elem; typedef struct no{ elem info; struct no *esq; struct no *dir; int fb; }No; typedef struct{ No *raiz; }Avl; void Criar(Avl *A); int Vazia(Avl *A); void Libera(Avl *A); void LiberaRec(No **pt); No *Busca(Avl *A, int chave); No *BuscaRec(No *pt, int *chave); void RotEsq(Avl *A); void RotEsqRec(No **pt); void RotDir(Avl *A); void RotDirRec(No **pt); void RotEsqDir(Avl *A); void RotEsqDirRec(No **pt); void RotDirEsq(Avl *A); void RotDirEsqRec(No **pt); int Insere(Avl *A, elem v); int InsereRec(No **pt, elem *v); int Remove(Avl *A, int chave); int RemoveRec(No **pt, int *chave); elem BuscaMenor(No *pt); elem BuscaMaior(No *pt); void PreOrdem(Avl *A); void EmOrdem(Avl *A); void PosOrdem(Avl *A); void PreOrdemRec(No *pt); void EmOrdemRec(No *pt); void PosOrdemRec(No *pt); int Altura(No *pt); int NumNos(Avl *A); int NumNosRec(No *pt); int Bal(Avl *A); int BalRec(No *pt); int PerfBal(Avl *A); int PerfBalRec(No *pt); void RotEsq(Avl *A); void RotEsqRec(No **pt); void RotDir(Avl *A); void RotDirRec(No **pt); void RotEsqDir(Avl *A); void RotEsqDirRec(No **pt); void RotDirEsq(Avl *A); void RotDirEsqRec(No **pt); int ContarFolhas(No *pt); int Nivel(Avl *A, int chave); int NivelRec(No *pt, int *chave); //IMPLEMENTAÇÃO DE ÁRVORE BINÁRIA /* tipo de dado "árvore"; implementar as suas funções. */ #include <stdio.h> #include <stdlib.h> #include "avl.h" //cria uma árvore vazia void Criar(Avl *A){ A->raiz = NULL; } //verifica se está vazia int Vazia(Avl *A){ return (A->raiz==NULL); } //Libera (destroi) a árvore void Libera(Avl *A){ LiberaRec(&(A->raiz)); } void LiberaRec(No **pt){ if(*pt != NULL){ LiberaRec(&((*pt)->esq)); LiberaRec(&((*pt)->dir)); free(*pt); } } //Inserir uma chave int Insere(Avl *A, elem v){ return(InsereRec(&(A->raiz), &v)); } int InsereRec(No **pt, elem *v){ No *aux; //variável ponteiro auxiliar if(*pt == NULL){ aux = (No*)malloc(sizeof(No)); if(aux==NULL) return 0; else{ aux->info = *v; aux->esq = aux->dir = NULL; *pt = aux; return 1; } } if(v->chave < (*pt)->info.chave) return(InsereRec(&((*pt)->esq), v)); if(v->chave > (*pt)->info.chave) return(InsereRec(&((*pt)->dir), v)); else return 0; //Já tem uma chave com o mesmo valor: não insere. } // Remoção de um NÓ int Remove(Avl *A, int chave){ return (RemoveRec(&(A->raiz), &chave)); } int RemoveRec(No **pt, int *chave){ No *aux; elem v; if(*pt==NULL) return 0; //não achou a chave a remover if(*chave < (*pt)->info.chave) return(RemoveRec(&((*pt)->esq), chave)); if(*chave > (*pt)->info.chave) return (RemoveRec(&((*pt)->dir), chave)); //achou a chave remover //caso 1: NÓ FOLHA if(!(*pt)->esq && !(*pt)->dir){ free(pt); *pt = NULL; } //caso 2.a: NÓ a remover tem só SAE else if((*pt)->dir == NULL){ aux = *pt; *pt = (*pt)->esq; free(aux); } //case 2.b: NÓ a remover tem só SAD else if((*pt)->esq == NULL){ aux = *pt; *pt = (*pt)->dir; free(aux); } //caso 3: NÓ a remover tem as SAE e SAD else{ (*pt)->info = BuscaMenor((*pt)->dir); *chave = (*pt)->info.chave; return RemoveRec(&((*pt)->dir), chave); } return 1; } //Rotação à esquerda void RotEsq(Avl *A){ RotEsqRec(&(A->raiz)); } void RotEsqRec(No **pt){ No *b = *pt; No *a = b->esq; a->dir = b; a->fb = 0; b->fb = 0; *pt = a; } //Rotação à direita void RotDir(Avl *A){ RotDirRec(&(A->raiz)); } void RotDirRec(No **pt){ No *a = *pt; No *b = a->dir; a->dir = b->esq; b->esq = a; a->fb = 0; b->fb = 0; *pt = b; } //Rotação Esquerda/Direita void RotEsqDir(Avl *A){ (&(A->raiz)); } void RotEsqDirRec(No **pt){ No *c = *pt; No *a = c->esq; No *b = a->dir; c->esq = b->dir; a->dir = b->esq; b->esq = a; b->dir = c; switch(b->fb){ case -1: a->fb = 0; c->fb = 1; break; case 0: a->fb = 0; c->fb = 0; break; case 1: a->fb = -1; c->fb = 0; break; } b->fb = 0; *pt = b; } //Rotação Direita/Esquerda void RotDirEsq(Avl *A){ RotDirEsqRec(&(A->raiz)); } void RotDirEsqRec(No **pt){ No *a = *pt; No *c = a->dir; No *b = c->esq; c->esq = b->dir; a->dir = b->esq; b->esq = a; b->dir = c; switch(b->fb){ case -1: a->fb = 0; c->fb = 1; break; case 0: a->fb = 0; b->fb = 0; break; case 1: a->fb = -1; c->fb = 0; break; } b->fb = 0; *pt = b; } //Busca uma chave No *Busca(Avl *A, int chave){ if(Vazia(A)) return NULL; else return(BuscaRec(A->raiz, &chave)); } No *BuscaRec(No *pt, int *chave){ if(pt==NULL) return pt; if(pt->info.chave == *chave) return pt; if(pt->info.chave < *chave) return(BuscaRec(pt->dir, chave)); else return(BuscaRec(pt->esq, chave)); } //Retorna o menor valor da árvore elem BuscaMenor(No *pt){ while(pt->esq != NULL) pt = pt->esq; return pt->info; } //Retorna o maior valor da árvore elem BuscaMaior(No *pt){ while(pt->dir != NULL) pt = pt->dir; return pt->info; } //Exibe em Pre-ordem void PreOrdem(Avl *A){ PreOrdemRec(A->raiz); } void PreOrdemRec(No *pt){ if(pt != NULL){ printf("%d ", pt->info.chave); PreOrdemRec(pt->esq); PreOrdemRec(pt->dir); } } //Exibe Em-ordem (E-R-D) void EmOrdem(Avl *A){ EmOrdemRec(A->raiz); } void EmOrdemRec(No *pt){ if(pt != NULL){ EmOrdemRec(pt->esq); printf("%d ", pt->info.chave); EmOrdemRec(pt->dir); } } //Exibe em Pos-ordem (E-D-R) void PosOrdem(Avl *A){ PosOrdemRec(A->raiz); } void PosOrdemRec(No *pt){ if(pt != NULL){ PosOrdemRec(pt->esq); PosOrdemRec(pt->dir); printf("%d ", pt->info.chave); } } //Mostra a altura da árvore int Altura(No *pt){ int He, Hd; if(pt == NULL) return -1; //Altura da árvore vazia é -1. if(pt != NULL){ He = Altura(pt ->esq); Hd = Altura(pt->dir); if(He > Hd) return He+1; else return Hd+1; } } //Mostra o número de nós int NumNos(Avl *A){ return(NumNosRec(A->raiz)); } int NumNosRec(No *pt){ int NumEsq, NumDir; if(pt == NULL) return 0; else{ NumEsq = NumNosRec(pt->esq); NumDir = NumNosRec(pt->dir); return(NumEsq + NumDir + 1); } } //Verifica se está balanceada int Bal(Avl *A){ return(BalRec(A->raiz)); } int BalRec(No *pt){ int DifAlturas; if(pt != NULL){ if(pt->esq == NULL && pt->dir == NULL) //só tem raiz return 1; //balanceada else if(pt->esq != NULL && pt->dir != NULL){ //SAE e SAD não nulas DifAlturas = Altura(pt->esq) - Altura(pt->dir); return(BalRec(pt->esq) && BalRec(pt->dir) && ((DifAlturas==0) || (DifAlturas==1) || (DifAlturas==-1))); } else if(pt->esq != NULL) return (Altura(pt->esq) == 1); else return (Altura(pt->dir) == 1); } } //Ver se é Perfeitamente Balanceada (usa a função NumNos) int PerfBal(Avl *A){ return(PerfBalRec(A->raiz)); } int PerfBalRec(No *pt){ int DifNumNos; if(pt != NULL){ if(pt->esq == NULL && pt->dir == NULL) //só tem raiz return 1; //balanceada else if(pt->esq != NULL && pt->dir != NULL){ //SAE e SAD não nulas DifNumNos = NumNosRec(pt->esq) - NumNosRec(pt->dir); return(PerfBalRec(pt->esq) && PerfBalRec(pt->dir) && ((DifNumNos==0) || (DifNumNos==1) || (DifNumNos==-1))); } } return(PerfBalRec(pt->esq) && PerfBalRec(pt->dir)); if(pt->esq != NULL) //tem um único filho à esquerda return (NumNosRec(pt->esq) == 1); else return (NumNosRec(pt->dir) == 1); } //Retorna o número de NÓS folha int ContarFolhas(No *pt){ if(pt == NULL) return 0; //árvore vazia if(pt->esq == NULL && pt->dir == NULL) return 1; //A raiz é folha. else return ContarFolhas(pt->esq) + ContarFolhas (pt->dir); } int Nivel(Avl *A, int chave){ return NivelRec(A->raiz, &chave); } int NivelRec(No *pt, int *chave){ int nivel = 0; if(pt == NULL) return nivel; if(! pt->esq && ! pt->dir) return nivel; else{ nivel ++; return nivel; } } //IMPLEMENTAÇÃO DE ÁRVORE BINÁRIA AVL #include <stdio.h> #include <stdlib.h> #include <locale.h> #include "avl.h" int main() { setlocale(LC_ALL, "Portuguese"); Avl A; Criar(&A); int opcao; elem dado; do{ system("cls"); printf(" 1 - Árvore vazia. \n"); printf(" 2 - Destruir a árvore. \n"); printf(" 3 - Buscar uma chave. \n"); printf(" 4 - Insere uma chave. \n"); printf(" 5 - Remove um nó. \n"); printf(" 6 - Mostra o menor valor. \n"); printf(" 7 - Mostra o maior valor. \n"); printf(" 8 - Exibe Pré-Ordem. \n"); printf(" 9 - Exibe Em-Ordem. \n"); printf(" 10 - Exibe Pós-Ordem. \n"); printf(" 11 - Balanceada. \n"); printf(" 12 - Perfeitamente balanceada. \n"); printf(" 13 - Rotação à esquerda. \n"); printf(" 14 - Rotação à direita. \n"); printf(" 15 - Rotação esquerda/direita. \n"); printf(" 16 - Rotação direita/esquerda. \n"); printf(" 17 - Número de Nós. \n"); printf(" 18 - Nível do Nó. \n"); printf(" 19 - Sair. \n"); printf("\n Escolha uma opção: "); scanf("%d ", &opcao); switch(opcao){ case 1: //Ver se está vazia. if(Vazia(&A)) printf("\n Está vazia. \n"); else printf(" Não está vazia. \n"); break; case 2: //Destruir a árvore Libera(&A); break; case 3: //Busca uma chave printf("\n Digite a chave a ser buscada: "); scanf("%d ", &dado.chave); if(Busca(&A, dado.chave)) printf(" Encontrou a chave buscada. \n"); else (" Não encontrou. \n"); break; case 4: //Insere uma chave printf("\n Digite a chave a inserir: "); scanf("%d ", &dado.chave); if(Insere(&A, dado)) printf("\n Chave inserida. \n"); else printf("\n Não inseriu. \n"); break; case 5: //Remove o nó printf("\n Digite a chave a remover: "); scanf("%d ", &dado.chave); if(Remove(&A, dado.chave)) printf("\n Removeu. \n"); else printf(" Não removeu. \n"); break; case 8: //Exibe Pré-Ordem PreOrdem(&A); break; case 9: //Exibe Em-Ordem EmOrdem(&A); break; case 10: //Exibe Pós-Ordem PosOrdem(&A); break; case 11: //Balanceada if(Bal(&A)) printf("\n Balanceada. \n"); else printf("\n Não está balanceada. \n"); break; case 12: //Perfeitamente balanceada if(PerfBal(&A)) printf("\n Perfeitamente balanceada. \n"); else printf(" Não está perfeitamente balanceada. \n"); break; case 13: //Rotação à esquerda RotEsq(&A); break; case 14: //Rotação à direita RotDir(&A); break; case 15: //Rotação esquerda/direita RotEsqDir(&A); break; case 16: //Rotação direita/esquerda RotDirEsq(&A); break; case 17: //Número de nós NumNos(&A); break; /*case 18: //Nível de um nó. printf("\n Digite o valor da chave: "); scanf("%d ", &dado.chave); if(Nivel(&A)) printf("\n O nível de %d é %d ", dado.chave, nivel); else printf("\n Não encontrou a chave buscada. "); */ case 19: //Encerrar o programa printf("\n Encerrar a execução. \n"); break; } system("pause"); }while(opcao != 18); return 0; }
  2. int main(int argc, char** argv) { setlocale(LC_ALL, "Portuguese"); int mat[LIN][COL], i, j, vet[COL] = {0}; for(i = 0; i < LIN; i++){ for(j = 0; j < COL; j++){ printf("Digite o elemento[%d][%d]: ", i, j); scanf("%d", &mat[i][j]); } } printf("\n\n"); for(i = 0; i < COL; i++){ for(j = 0; j < LIN; j++) vet[i] = vet[i] + mat[j][i]; } for(j = 0; j < COL; j++) printf("VETOR [%d]: %d\n", j, vet[j]); return 0; } int main(int argc, char** argv) { setlocale(LC_ALL, "Portuguese"); int mat[LIN][COL], i, j, vet[COL] = {0}; for(i = 0; i < LIN; i++){ for(j = 0; j < COL; j++){ printf("Digite o elemento[%d][%d]: ", i, j); scanf("%d", &mat[j]); } } printf("\n\n"); for(i = 0; i < COL; i++){ for(j = 0; j < LIN; j++) vet = vet + mat[j]; } for(j = 0; j < COL; j++) printf("VETOR [%d]: %d\n", j, vet[j]); return 0; }

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