/* Desaloca a memoria alocada para a arvore, percorrendo os ramos recursivamente */ no_p libera_arvore(no_p atual) { if (atual != NULL) { libera_arvore(atual->ramo[NAO]); libera_arvore(atual->ramo[SIM]); free(atual); } return NULL; }
void libera_arvore(tipo_arvore * arvore){ if (arvore->esq != NULL){ libera_arvore(arvore->esq); } if (arvore->dir != NULL){ libera_arvore(arvore->dir); } libera_simbolo(arvore->simbolo); free(arvore); }
void remove_tabela_simbolos(tipo_floresta * floresta){ if (floresta->ultimo != NULL){ tipo_cel * aux = floresta->ultimo; floresta->ultimo = aux->ant; if (aux->arvore != NULL){ libera_arvore(aux->arvore); } aux->ant = NULL; aux->prox = NULL; free(aux); remove_tabela_simbolos(floresta); } else{ floresta->primeiro = NULL; free(floresta); } }
void remove_nivel(tipo_floresta * floresta){ if (floresta->primeiro == NULL || floresta->ultimo == NULL){ fprintf(stderr, "\nFloresta vazia, não é possível remover nível\n"); exit(1); } tipo_cel * aux = floresta->ultimo; floresta->ultimo = aux->ant; if (floresta->ultimo == NULL){ floresta->primeiro = NULL; } else{ floresta->ultimo->prox = NULL; } if (aux->arvore != NULL){ libera_arvore(aux->arvore); } free(aux); }