//deep_free_node int deep_free_node(Node* n){ int i; if(n != NULL){ for(i = 0; i < nb_of_children(n); i++) deep_free_node(child(n, i)); free(n); } return 0; }
int main () { Node *pf1, *pf3, *pf0; Node **children; pf1 = create_leaf(1, int_node, "1", NULL); pf3 = create_leaf(1, int_node, "2", NULL); pack_nodes(&children, 0, pf1); pack_nodes(&children, 1, pf3); printf("h = %d\n", height(pf1)); /* deve imprimir 1 */ pf0 = create_node(1, int_node, "0", NULL, 2, children); /* pf0 é o pai de pf1 e pf3 */ printf("h = %d\n", height(pf0)); /* deve imiprimir 2 */ printf("n = %d\n", nb_of_children(pf0)); /* deve imprimir 2 */ printf("n = %d\n", nb_of_children(child(pf0, 0))); /* deve imprimir 0, porque o retorno de child é o filho de pf0, que é uma folha. */ deep_free_node(pf0); }
// MAIS OU MENOS... TESTAR // Return 0, ok... int deep_free_node(Node* n) { //Testa se o ponteiro dado é NULL if (n == NULL) { printf("ERRO! Ponteiro dado é NULL"); exit(-1); } int i; // iterador de laço // Testa se existem filhos para serem desalocados // Não sei se precisaria disso... // if ( n->num_child == 0 ) { // free(n); // Desaloca n, e retorna zero (n não possui filhos) // return 0; // } // Caso contrário, vai liberando para cada filho, recursivamente for (i=0; i < n->num_child; i++) { deep_free_node(n->child[i]); } // Desaloca o nodo corrente free(n); return 0; // tanto faz }
int main(int argc, char *argv[]) { /* * n * t a * b * */ Node** children1; Node** children2; Node* b = create_leaf(4,305, "lexeme ( b ) \n", NULL); pack_nodes(&children1, 0, b); Node* t = create_node(23, 305, "lexeme ( t ) \n", NULL, 1, children1); Node* a = create_leaf(5, 302, "lexeme ( a ) \n", NULL); pack_nodes(&children2, 0, t); pack_nodes(&children2, 1, a); Node* n = create_node(5, 302, "lexeme ( n ) : root \n", NULL, 2, children2); /* imprime a altura da arvore */ printf ( "height: %d \n", height(a)); printf ( "%s" , n->lexeme); printf ( "%s" , child(n,1)->lexeme); printf ( "%s" , child(n,2)->lexeme); printf ( "%s", child(child(n,1),1)->lexeme); deep_free_node(n); return 0; }