Ir ao conteúdo
  • Cadastre-se

Marcos Aurélio Alves Caval

Membro Júnior
  • Posts

    3
  • Cadastrado em

  • Última visita

posts postados por Marcos Aurélio Alves Caval

  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;

    }

                   

                   

     

     

     

     

     

                   

                   

     

     

     

     

     

     

    • Curtir 1
  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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!