Árvores Binárias em C
Publicado por Ivan Rocha 13/06/2007
[ Hits: 16.143 ]
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);
}
Escolha o algoritmo de ordenação
Soma dos dígitos de um número decimal
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
PIP3 - erro ao instalar módulo do mariadb para o Python (9)
É normal não gostar de KDE? (8)
O programa assinador digital (0)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)









