/* ============================================================================== Programa principal: Prova Laboratorio: 01 Autor: Fulano de Tal Disciplina: MC202 Data: xx / yy /2000 ============================================================================== */ #include void Lelinha() { char c; do { scanf("%c", &c); } while (c !='\n'); return; } void ImprimeArvore(ArvBin ab, int nivel) { int n; if (ab != NULL) { ImprimeArvore(ab->dir, nivel+1); for (n=1; n <= nivel; n++) printf(" "); printf("%3d",ab->info); for (n=nivel; n <= 10; n++) printf("---"); printf("\n"); ImprimeArvore(ab->esq, nivel+1); } } int main() { char acao,saida[TAM_MAX]; char *s; int caso=4; int valor,*frequencia=NULL,i,num_elementos=0; ArvBin ab=NULL; /* --------------------------------------------------------------------------- */ /* Declarações e comando para verificação do uso da memória dinâmica A variável 'lixo' está sendo usada apenas para contornar um problema do funcionamento das funções da biblioteca 'malloc': a memória por ela apontada é desalocada logo a seguir! --------------------------------------------------------------------------- */ void *lixo = malloc(1); /* truque */ struct mallinfo info; int MemDinInicial, MemDinFinal; free(lixo); /* truque */ info = mallinfo(); MemDinInicial = info.uordblks; /* --------------------------------------------------------------------------- */ /* Caso 1: opcoes i,r,p Caso 2: opcoes i,r,p,n,a Caso 3: opcoes i,r,p,n,a,M,m Caso 4: opcoes i,r,p,n,a,M,m,f,e */ scanf("%d\n",&caso); do { scanf("%c",&acao); printf("Acao: %c \n",acao); switch (acao) { case 'i': scanf("%d",&valor); InsereValor(&ab,valor); ImprimeArvore(ab,1); break; case 'r': scanf("%d",&valor); RemoveValor(&ab,valor); ImprimeArvore(ab,1); break; case 'p': scanf("%d",&valor); switch (valor) { case 0: ImprimeArvore(ab,1); break; case 1: printf("Valores em pre-ordem: "); s = saida; *s = '\0'; VisitaPreOrdem(ab,&s); printf("%s\n",saida); break; case 2: printf("Valores em in-ordem: "); s = saida; *s = '\0'; VisitaInOrdem(ab,&s); printf("%s\n",saida); break; case 3: printf("Valores em pos-ordem: "); s = saida; *s = '\0'; VisitaPosOrdem(ab,&s); printf("%s\n",saida); break; default: printf("Opcao Invalida:\n"); break; } break; case 'n': if (caso >= 2) { printf("O numero de nos da arvore eh %d\n",NumerodeNos(ab)); } break; case 'a': if (caso >= 2) { printf("A altura da arvore eh %d\n",Altura(ab)); } break; case 'M': scanf("%d",&valor); if (caso >= 3) { s = saida; *s = '\0'; if (valor > 1) printf("%d ",valor); MaioresValores(ab,&s,&valor); printf("maior(es) valor(es) em ordem decrescente: %s\n",saida); } break; case 'm': scanf("%d",&valor); if (caso >= 3) { s = saida; *s = '\0'; if (valor > 1) printf("%d ",valor); MenoresValores(ab,&s,&valor); printf("menor(es) valor(es) em ordem crescente: %s\n",saida); } break; case 'f': if (caso == 4) { Frequencia(ab,&frequencia,&num_elementos); for (i=0; i < num_elementos; i++) if (frequencia[i] != 0) printf("O elemento %5d ocorre %5d vez(es)\n",i,frequencia[i]); } break; case 'e': if (caso == 4) { EliminaRepetidos(&ab); ImprimeArvore(ab,1); } break; case 't': printf("\n\nFim da execução.\n\n"); break; case '#': Lelinha(); break; default: printf("ação %c inexistente \n",acao); break; } Lelinha(); } while (acao != 't'); if (frequencia != NULL) free(frequencia); LiberaArvore(&ab); /* --------------------------------------------------------------------------- */ /* Verificação final do uso da memória dinâmica */ /* --------------------------------------------------------------------------- */ info = mallinfo(); MemDinFinal = info.uordblks; if (MemDinInicial!=MemDinFinal) printf("\n\nMemória dinâmica não foi totalmente liberada (%d, %d)\n", MemDinInicial,MemDinFinal); /* --------------------------------------------------------------------------- */ return 0; } /* main */ /* author: Gustavo Sverzut Barbieri (http://www.gustavobarbieri.com.br) */