Árvores Binárias em C
Publicado por Ivan Rocha 13/06/2007
[ Hits: 15.920 ]
Homepage: http://homes.dcc.ufba.br/~ivan062/bahia
Manipulação de Árvores Binárias em C.
Listagem de filhos por nível, percursos em pré-ordem, em ordem, e em pós-ordem.
Desenho da árvore até o décimo nível, listagem de dados cadastrais.
Obs: Falta a criação dos menus e submenus. Cabe à inteligência de aprendizado de cada um perceber o que faz cada menu!
/* Universidaade Federal da Bahia Instituto de Matematica Departamento de Ciencia da Computacao MATA40 - Algoritmos e Estruturas de Dados I Professor Flavio Assis Ivan Carmo da Rocha Neto - Mat: 200620260 Trabalho de Estruturas de Dados */ # include <stdio.h> # include <stdlib.h> # include <string.h> # include <ctype.h> # define NUM 10 /*Declaração da Estrutura da ficha cadastral do Funcionario*/ typedef struct Funcionario{ char nome[20], depto[30]; int idnum; float salario; struct Funcionario *noEsq, *noDir, *noPai, *nomeAnt, *nomeProx; /*Ponteiros p/ a estrutura, p/ listas simples e duplas*/ }Func; /*nomeProx, nomeAnt, idnumProx - ponteiro para proximo (anterior) na lista de nomes (numeros)*/ typedef struct Vetor{ Func *vet[NUM]; /* listaVetor é uma estrutura, para um vetor que contém listas*/ }listaVetor; /*Funcao para a comparacao de strings, que sera utilizada para a ordenacao alfabetica*/ int comparaStrings(char str1[], char str2[], int qtd){ int i = 0; while(i < qtd){ if((str1[i] == '{FONTE}') && (str2[i] == '{FONTE}')) return(0); else{ if (toupper(str1[i]) == toupper(str2[i])) i += 1; else{ if(toupper(str1[i]) > toupper(str2[i])) return(1); if(toupper(str1[i]) < toupper(str2[i])) return(-1); } } } } /*Funcao retorna -1, se string1 < string2, e retorna 1 se string1 > string2*/ /*Procedimento para Inicializar as Listas*/ void inicializa(Func **Arvore, Func **lDupla){ int i = 0; (*Arvore) = NULL; /*inicializa arvore e lista dupla*/ (*lDupla) = NULL; }; void percorre_tudo(Func *p, int i){ if (p!= NULL) if (i==1) printf("%d ", p-> idnum); //p^.id é o código do funcionário (chave do nó) else{ i=i-1; //if(p -> noEsq != NULL) percorre_tudo(p -> noEsq, i); //p^.esq é o apontador para o filho da esquerda (menor) //if(p -> noDir != NULL) percorre_tudo(p -> noDir, i); //p^.dir é o apontador para o filho da direita (maior) } else printf("[]"); } void desenha(Func *pai){ int i; printf("\n"); for (i = 1; i <= 10; i++) //listará do nível 1 (raiz) até o 10 { percorre_tudo(pai, i); printf("\n"); } } void desenhaListaDup(Func **lDupla){ Func *p; p = *lDupla; printf("\n"); if(p != NULL){ while(p){ printf("%d ", p -> idnum); p = p -> nomeProx; } printf("\n\n"); p = *lDupla; while(p){ printf("%s ", p -> nome); p = p -> nomeProx; } printf("\n"); } } /* Procedimento para implementacao da Lista Simples */ /*void insereFichaVetor(listaVetor *lVet, Func **ficha, int posicao){ Func *p; int achou = 0; p = (*ficha); if(lVet -> vet[posicao] == NULL){ lVet -> vet[posicao] = p;*/ /*se o vetor for nulo, ele recebe p, que contem o primeiro cadastro*/ /*}else{ p = lVet -> vet[posicao]; if (((*ficha) -> idnum) < (p -> idnum)){ (*ficha) -> idnumProx = p; lVet -> vet[posicao] = (*ficha);*/ /*se logo o primeiro encontrado for Num maior...*/ /*}else{ while((!achou) && (p -> idnumProx)){ if(((*ficha) -> idnum) < (p -> idnumProx -> idnum)){ (*ficha) -> idnumProx = p -> idnumProx; p -> idnumProx = (*ficha); achou = 1; }else{ p = p -> idnumProx;*/ /*neste while, ele vai procurando ate achar um com Num > que ele*/ /*} } if(!achou){ (*ficha) -> idnumProx = p -> idnumProx; p -> idnumProx = (*ficha);*/ /*se não encontrar Num maior, insere no final*/ /*} } } };*/ /* Procedimento para implementacao da Arvore */ void insereFichaArvore(Func **ficha, Func **Arvore){ Func *p; int achou = 0; p = (*ficha); if((*Arvore) == NULL){ //p -> noEsq = NULL; //p -> noDir = NULL; //p -> noPai = NULL; (*Arvore) = p; }else{ p = (*Arvore); while(p && !achou){ if((*ficha) -> idnum < p -> idnum){ if(p -> noEsq == NULL){ p -> noEsq = (*ficha); //(*ficha) -> noEsq = NULL; //(*ficha) -> noDir = NULL; (*ficha) -> noPai = p; //p = NULL; achou = 1; }else p = p -> noEsq; }else{ if((*ficha) -> idnum > p -> idnum){ if(p -> noDir == NULL){ p -> noDir = (*ficha); (*ficha) -> noEsq = NULL; (*ficha) -> noDir = NULL; (*ficha) -> noPai = p; //p = NULL; achou = 1; }else p = p -> noDir; } } } } } /*Funcao para implementacao da Lista Dupla*/ void insereFichalDupla(Func **ficha, Func **lDupla){ Func *p; int achou = 0; /*funcao que utiliza os mesmos principios da que insere no vetor*/ p = (*ficha); if((*lDupla) == NULL){ p -> nomeAnt = NULL; p -> nomeProx = NULL; (*lDupla) = p; }else{ p = (*lDupla); if(comparaStrings(((*ficha) -> nome), (p -> nome), 20) < 0){ /*funcao criada para comparar strings*/ (*ficha) -> nomeAnt = p -> nomeAnt; (*ficha) -> nomeProx = p; p -> nomeAnt = (*ficha); (*lDupla) = (*ficha); }else{ while((p -> nomeProx) && (!achou)){ if(comparaStrings(((*ficha) -> nome), (p -> nomeProx -> nome), 20) < 0){ (*ficha) -> nomeProx = p -> nomeProx; (*ficha) -> nomeAnt = p; p -> nomeProx -> nomeAnt = (*ficha); p -> nomeProx = (*ficha); achou = 1; }else p = p -> nomeProx; } if(!achou){ (*ficha) -> nomeProx = p -> nomeProx; (*ficha) -> nomeAnt = p; p -> nomeProx = (*ficha); } } } } /*Funcao para Inserir Ficha de Funcionario*/ int insere(Func **Arvore, Func **lDupla, int numero){ Func *ficha; int posicaoVetor, i; /*char deptoTemp[30]; char deptoAdm[] = "administrativo{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}"; char deptoPed[] = "pesquisa-e-desenvolvimento{FONTE}{FONTE}{FONTE}{FONTE}"; char deptoProd[] = "producao{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}{FONTE}";*/ while(numero != 0){ ficha = ((Func *)malloc(sizeof(Func))); getchar(); gets(ficha -> nome); scanf("%d", &ficha -> idnum); getchar(); //scanf("%s ", ficha -> depto); //scanf("%s ", ficha -> depto); gets(ficha -> depto); /*leitura de um dado temporario para ser transformado na saida desejada*/ /*if((deptoTemp[0] == 'a') && (deptoTemp[1] == 'd') && (deptoTemp[2] == 'm')){ for(i = 0; i< 30; i++){ (ficha -> depto[i]) = deptoAdm[i]; } }else{ if((deptoTemp[0] == 'p') && (deptoTemp[1] == 'e') && (deptoTemp[2] == 'd')){ for(i = 0; i< 30; i++){ (ficha -> depto[i]) = deptoPed[i]; } }else{ if((deptoTemp[0] == 'p') && (deptoTemp[1] == 'r') && (deptoTemp[2] == 'o') && (deptoTemp[3] = 'd')){ for(i = 0; i< 30; i++){ (ficha -> depto[i]) = deptoProd[i]; } } } }*/ //ficha -> depto = deptoTemp; scanf("%f", &ficha -> salario); posicaoVetor = (ficha -> idnum) % NUM; insereFichaArvore(&ficha, &(*Arvore)); /*chamada de funcao para inserir na arvore*/ insereFichalDupla(&ficha, &(*lDupla)); /*chamada de funcao para inserir na lista dupla*/ numero -= 1; } }; /*Funcao para Retirar Funcionario da Lista Simples*/ /*void retiraFichaVetor(listaVetor *lVet, int numero, int posicao){ Func *p, *q; int achou = 0; p = lVet -> vet[posicao]; if(p != NULL){ if (numero == p -> idnum){ lVet -> vet[posicao] = p -> idnumProx;*/ /*se o primeiro encontrado, for o que se quer remover, */ //}else{ /*avanca-se a lista em uma posicao*/ /*while((!achou) && (p -> idnumProx)){ if(numero == (p -> idnumProx -> idnum)){ q = p -> idnumProx; p -> idnumProx = q -> idnumProx;*/ /*manipulacao de ponteiros para remocao.*/ //achou = 1; /*o free so sera dado depois de manipulados os ponteiros */ //}else{ /*da lista dupla*/ /*p = p -> idnumProx; } } } } };*/ /*Funcao Facilitador para Remocao*/ Func *MenorDireita(Func *p){ while(p -> noEsq) p = p -> noEsq; return p; } /*Funcao para Retirar Funcionario da Arvore*/ //******************************************** void retiraFichaArvore(int numero, Func **Arvore){ Func *p, *menDir, *q, *aux; int achou = 0, i; p = (*Arvore); /* p eh o que se quer remover */ aux = ((Func *)malloc(sizeof(Func))); while(p && !achou){ if(numero == p -> idnum) achou = 1; else if(numero < p -> idnum) p = p -> noEsq; else p = p -> noDir; } if(achou){ if((p -> noEsq == NULL)|| (p -> noDir == NULL)) menDir = p; else menDir = MenorDireita(p -> noDir); if(menDir -> noEsq != NULL) q = menDir -> noEsq; else q = menDir -> noDir; if(q != NULL) q -> noPai = menDir -> noPai; if(menDir -> noPai == NULL) (*Arvore) = q; else if(menDir == menDir -> noPai -> noEsq) menDir -> noPai -> noEsq = q; else menDir -> noPai -> noDir = q; printf("p -> idnum = %d\n", p -> idnum); usleep(1000000); printf("menDir -> idnum = %d\n", menDir -> idnum); usleep(1000000); if(menDir != p){ //printf("sdofihsdfiushfiusdh\n"); for(i = 0; i < 20; i++) aux -> nome[i] = p -> nome[i]; aux -> idnum = p -> idnum; for(i = 0; i < 30; i++) aux -> depto[i] = p -> depto[i]; aux -> salario = p -> salario; for(i = 0; i < 20; i++) p -> nome[i] = menDir -> nome[i]; p -> idnum = menDir -> idnum; for(i = 0; i < 30; i++) p -> depto[i] = menDir -> depto[i]; p -> salario = menDir -> salario; for(i = 0; i < 20; i++) menDir -> nome[i] = aux -> nome[i]; menDir -> idnum = aux -> idnum; for(i = 0; i < 30; i++) menDir -> depto[i] = aux -> depto[i]; menDir -> salario = aux -> salario; aux -> nomeProx = menDir -> nomeProx; aux -> nomeAnt = menDir -> nomeAnt; if(menDir -> nomeProx != NULL) menDir -> nomeProx -> nomeAnt = aux; if(menDir -> nomeAnt != NULL) menDir -> nomeAnt -> nomeProx = aux; menDir -> nomeProx = p -> nomeProx; menDir -> nomeAnt = p -> nomeAnt; if(p -> nomeProx != NULL) p -> nomeProx -> nomeAnt = menDir; if(p -> nomeAnt != NULL) p -> nomeAnt -> nomeProx = menDir; p -> nomeProx = aux -> nomeProx; p -> nomeAnt = aux -> nomeAnt; if(aux -> nomeProx != NULL) aux -> nomeProx -> nomeAnt = p; if(aux -> nomeAnt != NULL) aux -> nomeAnt -> nomeProx = p; //free(menDir); /*if(p -> noPai != NULL){ //******************* if(p -> noPai -> noEsq == p) p -> noPai -> noEsq = menDir; else if(p -> noPai -> noDir == p) p -> noPai -> noDir = menDir; }else (*Arvore) = menDir; menDir -> noPai = p -> noPai; menDir -> noEsq = p -> noEsq; menDir -> noDir = p -> noDir; if(p -> noEsq != NULL) p -> noEsq -> noPai = menDir; if(p -> noDir != NULL) p -> noDir -> noPai = menDir;*/ //******************** /*if(p -> noDir != menDir){ printf("p -> noDir != menDir\n"); printf("p -> idnum = %d\n", p -> idnum); usleep(1000000); printf("menDir -> idnum = %d\n", menDir -> idnum); usleep(1000000); aux -> noPai = menDir -> noPai;//**** aux -> noEsq = menDir -> noEsq; aux -> noDir = menDir -> noDir;//**** if(p -> noPai != NULL){ if(p -> noPai -> noEsq == p) p -> noPai -> noEsq = menDir; else if(p -> noPai -> noDir == p) p -> noPai -> noDir = menDir; }else (*Arvore) = menDir; menDir -> noPai = p -> noPai; menDir -> noEsq = p -> noEsq; menDir -> noDir = p -> noDir; if(p -> noEsq != NULL) p -> noEsq -> noPai = menDir; if(p -> noDir != NULL) p -> noDir -> noPai = menDir; //**************************** if(q != NULL) q -> noPai = p; p -> noEsq = aux -> noEsq;//**** p -> noDir = aux -> noDir; p -> noPai = aux -> noPai;//**** }else{ printf("p -> noDir = menDir\n"); printf("p -> idnum = %d\n", p -> idnum); usleep(1000000); printf("menDir -> idnum = %d\n", menDir -> idnum); usleep(1000000); aux -> noPai = menDir;//***** aux -> noEsq = menDir -> noEsq; aux -> noDir = menDir -> noDir;//***** menDir -> noDir = p; menDir -> noEsq = p -> noEsq; menDir -> noPai = p -> noPai; if(p -> noPai != NULL){ if(p -> noPai -> noEsq == p) p -> noPai -> noEsq = menDir; else if(p -> noPai -> noDir == p) p -> noPai -> noDir = menDir; }else (*Arvore) = menDir; if(p -> noEsq != NULL) p -> noEsq -> noPai = menDir; p -> noEsq = aux -> noEsq;//*** p -> noDir = aux -> noDir; p -> noPai = aux -> noPai;//*** if(q != NULL) q -> noPai = p; }*/ } //free(p); } } /*Funcao para Retirar Funcionario da Lista Dupla*/ void retiraFichalDupla(int numero, Func **lDupla){ Func *p, *q; int achou = 0; p = (*lDupla); if(p != NULL){ if (numero == p -> idnum){ (*lDupla) = (*lDupla) -> nomeProx; /*mesmo principio da remocao da lista simples*/ free(p); }else{ while((!achou) && (p -> nomeProx)){ if(numero == (p -> nomeProx -> idnum)){ q = p -> nomeProx; p -> nomeProx = q -> nomeProx; if(q -> nomeProx != NULL) q -> nomeProx -> nomeAnt = q -> nomeAnt; free(q); achou = 1; }else{ p = p -> nomeProx; } } } } }; /*Funcao para retirar funcionario da Lista*/ void retira(Func **Arvore, Func **lDupla, int numero){ int posicaoVetor; posicaoVetor = numero % NUM; /*chamada de procedimento para manipulacao de */ retiraFichaArvore(numero, &(*Arvore)); /*ponteiros na lista simples*/ retiraFichalDupla(numero, &(*lDupla)); /*chamada de procedimento para manipulacao de*/ //retiraFichaArvore(numero, &(*Arvore)); /*ponteiros na lista dupla e remocao de ficha*/ }; /*Funcao que consulta dados de funcionario por numero identificacao*/ void consulta(Func **lDupla, int numero){ Func *p; int achou = 0; p = *lDupla; if(p != NULL){ while((p) && (!achou)){ if(numero == (p -> idnum)){ /*procura o id, comparando os ids cadastrados com o id*/ achou = 1; /*do funcionario ate encontrar um numero */ }else /*igual ao que se quer, se encontrado, lista */ p = p -> nomeProx; /*os dados do funcionario.*/ } if(achou){ printf("%s\n", p -> nome); printf("%d\n", p -> idnum); if((p -> depto[0] == 'a') && (p -> depto[1] == 'd') && (p -> depto[2] == 'm')) //printf("%s\n", p -> depto); printf("administrativo\n"); else if((p -> depto[0] == 'p') && (p -> depto[1] == 'e') && (p -> depto[2] == 'd')) printf("pesquisa-e-desenvolvimento\n"); else if((p -> depto[0] == 'p') && (p -> depto[1] == 'r') && (p -> depto[2] == 'o') && (p -> depto[3] = 'd')) printf("producao\n"); else printf(" \n"); printf("%.2f\n", p -> salario); } } } /*Procedimento para listar numeros de funcionarios por indice do vetor*/ /*void listagemVetor(listaVetor *lVet, int posicao){ Func *p; if(posicao < NUM){ p = lVet -> vet[posicao];*/ /*percorre a lista da posicao do vetor inteira, */ //if(p != NULL){ /*listando os codigos de todos os funcionarios cadas- */ //while(p){ /*trados nessa posicao de vetor*/ /*printf("%d\n", p -> idnum); p = p -> idnumProx; } } } }*/ /*Procedimento para a Listagem de Funcionarios Crescente ou Decrescente*/ void listagemNome(Func *lDupla, char ordem){ char letInicio, aux[20],letFim[20]; Func *p, *q; int achou = 0; getchar(); scanf("%c", &letInicio); getchar(); scanf("%s", &letFim); if(letInicio <= letFim[0]){ /*se letra inicio maior que letra fim, nem entra em nada*/ letInicio = toupper(letInicio); letFim[0] = toupper(letFim[0]); if (lDupla != NULL){ while((lDupla) && (!achou)){ /*vai comparando ate encontrar uma letra menor, */ aux[0] = toupper(lDupla -> nome[0]); /*o que significa que sera o local onde iniciara*/ if(aux[0] >= letInicio){ /*a listagem*/ achou = 1; p = lDupla; }else lDupla = lDupla -> nomeProx; } if( p != NULL){ achou = 0; while((!achou) && (lDupla)){ /*vai comparando ate encontrar uma letra maior*/ aux[0] = toupper(lDupla -> nome[0]); /*o que significa que sera o local onde terminara*/ if(letFim[0] < aux[0]){ /*a listagem*/ achou = 1; }else{ q = lDupla; lDupla = lDupla -> nomeProx; } } switch(ordem){ /*o local onde se inicia e onde se termina a listagem, eh indicado*/ case 'c':{ /*pelos ponteiros p e q*/ while((p) != (q)){ puts(p -> nome); p = p -> nomeProx; /*se a opcao for crescente, avancara p ate chegar em q*/ } /*listando os nomes em cada passagem de p*/ puts(q -> nome); }break; case 'd':{ /*se a opcao for decrescente, recuara q ate chegar em p*/ while((q) != (p)){ /*listando os nomes em cada passagem de q*/ puts(q -> nome); q = q -> nomeAnt; } puts(p -> nome); }break; } } } } } /*Procedimento para a Listagem de Codigos por nivel da Arvore*/ void listaCodNivel(Func *Arvore, int nivel){ if((nivel == 1) && (Arvore != NULL)) printf("%d\n", Arvore -> idnum); else{ if(Arvore -> noEsq != NULL) listaCodNivel(Arvore -> noEsq, nivel - 1); if(Arvore -> noDir != NULL) listaCodNivel(Arvore -> noDir, nivel - 1); } } /*Funcao para o percurso em Pre-Ordem*/ void percursoPreOrdem(Func *Arvore){ if(Arvore != NULL){ printf("%d\n", Arvore -> idnum); //if(lDupla -> noEsq != NULL) percursoPreOrdem(Arvore -> noEsq); //if(lDupla -> noDir != NULL) percursoPreOrdem(Arvore -> noDir); } } /*Funcao para percorrer Arvore em Ordem*/ void percursoEmOrdem(Func *Arvore){ if(Arvore != NULL){ //if(lDupla -> noEsq != NULL) percursoEmOrdem(Arvore -> noEsq); printf("%d\n", Arvore -> idnum); //****************** COLOCAR O NUMERO, NOME SOH PRA TESTES //if(lDupla -> noDir != NULL) percursoEmOrdem(Arvore -> noDir); } } /*Funcao para percorrer Arvore em Pos-Ordem*/ void percursoPosOrdem(Func *Arvore){ if(Arvore != NULL){ //if(lDupla -> noEsq != NULL) percursoPosOrdem(Arvore -> noEsq); //if(lDupla -> noDir != NULL) percursoPosOrdem(Arvore -> noDir); printf("%d\n", Arvore -> idnum); } } /*Funcao para os percursos na Arvore*/ void percurso(Func *lDupla, int ordem){ switch(ordem){ case 'p': percursoPreOrdem(lDupla); break; case 'e': percursoEmOrdem(lDupla); break; case 'o': percursoPosOrdem(lDupla); break; default:break; } /*if(ordem == 'p') percursoPreOrdem(lDupla); else if(ordem == 'e') percursoEmOrdem(lDupla); else if(ordem == 'o') percursoPosOrdem(lDupla);*/ } /*Funcao percurso Filhos para excluir a listagem do pai*/ /*void percursoFilhos(Func *lDupla){ Func *p; if(lDupla != NULL){ numero = lDupla -> idnum; //if(lDupla -> noEsq != NULL) percursoFilhos(lDupla -> noEsq); if(lDupla -> idnum != numero); printf("%d\n", lDupla -> idnum); //if(lDupla -> noDir != NULL) percursoFilhos(lDupla -> noDir); } }*/ /*Funcao para a listagem dos codigos dos Filhos de um no*/ void listaFilhos(Func *lDupla, int numero){ //TESTAAAAARRRRRRR *********************************** int achou = 0; if(lDupla != NULL){ while(lDupla && !achou){ if(numero == lDupla -> idnum) achou = 1; else if(numero < lDupla -> idnum) lDupla = lDupla -> noEsq; else lDupla = lDupla -> noDir; } if(achou){ percursoEmOrdem(lDupla -> noEsq); percursoEmOrdem(lDupla -> noDir); } } } void caminhoArvore(Func *Arvore){ printf("\n"); printf("%s\n", Arvore -> nome); while(Arvore -> noEsq){ printf("%s\n", Arvore -> noEsq -> nome); Arvore = Arvore -> noEsq; } printf("\n"); printf("%s\n", Arvore -> nome); while(Arvore -> noPai){ printf("%s\n", Arvore -> noPai -> nome); Arvore = Arvore -> noPai; } printf("\n"); printf("%s\n", Arvore -> nome); while(Arvore -> noDir){ printf("%s\n", Arvore -> noDir -> nome); Arvore = Arvore -> noDir; } printf("\n"); printf("%s\n", Arvore -> nome); while(Arvore -> noPai){ printf("%s\n", Arvore -> noPai -> nome); Arvore = Arvore -> noPai; } } /*Funcao Principal*/ int main(){ char op[1], escolha, ordem; Func *lDupla, *Arvore; int numero; inicializa(&Arvore, &lDupla); /*chamada de funcao para inicializar listas*/ for(;;){ gets(op); switch((op[0])){ case 'i':{ //printf("Quantos Funcionarios Inserir? "); scanf("%d", &numero); insere(&Arvore, &lDupla, numero); /*chamada da funcao inserir*/ }break; case 'r':{ printf("Numero de identificacao que se quer remover: "); scanf("%d", &numero); retira(&Arvore, &lDupla, numero); /*chamada da funcao retirar*/ }break; case 'c':{ printf("Numero de Identificacao que se quer consultar: "); scanf("%d", &numero); consulta(&lDupla, numero); /*chamada da funcao consulta*/ }break; /*case 'l':{ printf("Posicao do Vetor que se quer listar: "); scanf("%d", &numero);*/ //listagemVetor(&vetor, numero); ***********/*chamada da funcao listagem de posicao do vetor*/ //}break; case 'o':{ printf("Ordem em que se quer Listar os nomes: "); scanf("%c", &ordem); listagemNome(lDupla, ordem); /*chamada da funcao listagem nome crescente e */ }break; /*decrescente*/ case 'n':{ printf("Nivel da arvore que se quer consultar: "); scanf("%d", &numero); listaCodNivel(Arvore, numero); }break; case 'p':{ //printf("Pre-ordem, em ordem, ou pos-ordem? "); scanf("%c", &ordem); percurso(Arvore, ordem); /*chamada de funcao para percorrer a Arvore*/ }break; case 'f':{ printf("Filhos de qual no? "); scanf("%d", &numero); listaFilhos(lDupla, numero); /*chamada de funcao para a listagem dos filhos*/ }break; case 'd': desenha(Arvore); break; case 'l': desenhaListaDup(&lDupla); break; case 'a': caminhoArvore(Arvore); break; case 'e':{ exit(0); }break; default:{ }break; } } return (0); }
Tabela hash com classes e tratamento de colisões por encadeamento
Conversão do número de dias em anos (meu segundo programa em C)
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como atualizar o Debian 8 para o 10 (10)
Dica sobre iptables ACCEPT e DROP (6)
NGNIX - Aplicar SNAT para evitar roteamento assimetrico (29)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta