/* * Recursive portion of rbdestroy(). */ static void _rbdestroy(struct rbtree *tree, struct rbnode *node, void (*destroy)(void *)) { if (node != rbnil(tree)) { _rbdestroy(tree, node->left, destroy); _rbdestroy(tree, node->right, destroy); if (destroy != NULL) destroy(node->data); efree(node); } }
/* * Destroy the specified tree, calling the destructor destroy * for each node and then freeing the tree itself. */ void rbtree_destroy(struct rbtree *tree, void (*destroy)(void *)) { if (!tree) return; if (rbtree_first(tree)) _rbdestroy(tree, rbtree_first(tree), destroy); free(tree); }
/* * Destroy the specified tree, calling the destructor destroy * for each node and then freeing the tree itself. */ void rbdestroy(struct rbtree *tree, void (*destroy)(void *)) { _rbdestroy(tree, rbfirst(tree), destroy); efree(tree); }