void remove_all(struct hash *hash, struct node *n) { struct tree *t; struct tree_node *h, *s; if (n->neededby->root || n->providedby->root) return; h = tree_first(n->provide->root); while (h) { s = tree_search_tree_node(h->n->providedby, n); tree_node_free(h->n->providedby, s); remove_all(hash, h->n); h = tree_next(h); } h = tree_first(n->need->root); while (h) { s = tree_search_tree_node(h->n->neededby, n); tree_node_free(h->n->neededby, s); remove_all(hash, h->n); h = tree_next(h); } t = hash->tbl[hash_index(n->name)]; s = tree_search_tree_node(t, n); tree_node_free(t, s); node_free(n); }
static void tree_node_free(tree* tree, tree_node* node) { ASSERT(node != NULL); tree_node* llink = node->llink; tree_node* rlink = node->rlink; if (tree->del_func) tree->del_func(node->key, node->datum); FREE(node); if (llink) tree_node_free(tree, llink); if (rlink) tree_node_free(tree, rlink); }
void tree_node_free(struct tree_node * tn) { unsigned i; if (tn->head) { free(tn->head); tn->head = NULL; } if (tn->value) { free(tn->value); tn->value = NULL; } for (i = 0; i < tn->node_count; i++) { struct tree_node * tn2 = tn->nodes[i]; tn->nodes[i] = NULL; if (tn2) { tree_node_free(tn2); } } if (tn->nodes) { free(tn->nodes); tn->nodes = NULL; } return; }
void _bin_tree_flush (TreeNode *n, TreeNode *sent) { if (n != sent) { _bin_tree_flush (tree_node_get_left (n), sent); _bin_tree_flush (tree_node_get_right (n), sent); tree_node_free (n); } }
size_t tree_clear(void* Tree) { ASSERT(Tree != NULL); tree* tree = Tree; const size_t count = tree->count; if (tree->root) { tree_node_free(tree, tree->root); tree->root = NULL; tree->count = 0; } return count; }
void *rb_tree_delete (RbTree *t, void *data) { TreeNode *x; /* y's not SENTINEL child, or SENTINEL if y don't have child */ TreeNode *y; /* the node actually delete */ TreeNode *z; /* the node contain data */ TreeNode *py; /* parent of y */ assert (t != NULL); z = _bin_tree_search (tree_node_get_right (t->sent), t->sent, t->cmp_f, data); if (z == NULL) { fprintf (stderr, "warning!, return an NULL\n"); return NULL; } if ((tree_node_get_left (z) == t->sent) || (tree_node_get_right (z) == t->sent)) { y = z; } else { y = _bin_tree_successor (z, t->sent); } if (tree_node_get_left (y) != t->sent) { x = tree_node_get_left (y); } else { x = tree_node_get_right (y); } py = tree_node_get_parent (y); tree_node_set_parent (x, py); if (py == t->sent) { tree_node_set_right (t->sent, x); } else { if (y == tree_node_get_left (py)) { tree_node_set_left (py, x); } else { tree_node_set_right (py, x); } } if (y != z) { tree_node_set_content (z, tree_node_get_content (y)); } if (tree_node_is_black (y)) { rb_delete_fixup (t, x); } tree_node_free (y); (t->card)--; return data; }