/* ============================================================================== Programa principal: Prova Laboratorio: 01 Autor: Fulano de Tal Disciplina: MC202 Data: xx / yy /2000 ============================================================================== */ #include #include "arvoreb.h" void Lelinha() { char c; do { scanf("%c", &c); } while (c !='\n'); return; } void ImprimeArvore(ArvB *ab, int nivel, int filho) { int n; if (ab != NULL) { for (n=1; nelems; n++) printf(" %d",ab->info[n]); printf("]\n"); for (n=0; n <= ab->elems; n++) ImprimeArvore(ab->filhos[n], nivel+1, n); } } int main() { char acao; int i,valor; ArvB *ab[4]={NULL,NULL,NULL,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; /* --------------------------------------------------------------------------- */ do { scanf("%c",&acao); printf("Acao: %c \n",acao); switch (acao) { case 'c': /* Cria Arvore B */ scanf("%d %d",&i, &valor); if ((i < 0)||(i > 3)) printf("Indice invalido.\n"); else { if (ab[i] != NULL) ArvBDestroi(&(ab[i])); ab[i] = ArvBCria(valor); } break; case 'd': /* Destroi Arvore B */ scanf("%d",&i); if ((i < 0)||(i > 3)) printf("Indice invalido.\n"); else ArvBDestroi(&(ab[i])); break; case 'i': /* Insere valor na Arvore B */ scanf("%d %d",&i,&valor); if ((i < 0)||(i > 3)) printf("Indice invalido.\n"); else { if (!ArvBInsere(&(ab[i]),valor)) printf("Erro ao inserir valor.\n"); else ImprimeArvore(ab[i],1,0); } break; case 'b': /* Busca valor na Arvore B */ scanf("%d %d",&i,&valor); if ((i < 0)||(i > 3)) printf("Indice invalido.\n"); else { if ((valor = ArvBBusca(ab[i],valor))==0) printf("Erro ao procurar valor.\n"); else printf("Valor encontrado no nivel %d.\n", valor); } break; case 'r': /* Remove valor da Arvore B */ scanf("%d %d",&i,&valor); if ((i < 0)||(i > 3)) printf("Indice invalido.\n"); else { if (!ArvBRemove(&ab[i],valor)) printf("Erro ao remover valor.\n"); else ImprimeArvore(ab[i],1,0); } 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'); for (i=0; i<4; i++) if (ab[i] != NULL) ArvBDestroi(&(ab[i])); /* --------------------------------------------------------------------------- */ /* 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) */