From ec431b4e3b7309bc3f4eb033f8a8aa429cff776c Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Mon, 15 Nov 2004 14:49:17 +0000 Subject: [PATCH] Can't use rbapply() for rbdestroy since the destructor is passed a data pointer, not a node pointer. --- redblack.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/redblack.c b/redblack.c index 839b8af36..5cb7e5b64 100644 --- a/redblack.c +++ b/redblack.c @@ -35,6 +35,8 @@ static void rbrepair __P((struct rbtree *, struct rbnode *)); static void rotate_left __P((struct rbtree *, struct rbnode *)); static void rotate_right __P((struct rbtree *, struct rbnode *)); +static void _rbdestroy __P((struct rbtree *, struct rbnode *, + void (*)(VOID *))); /* * Red-Black tree, see http://en.wikipedia.org/wiki/Red-black_tree @@ -307,30 +309,33 @@ rbsuccessor(tree, node) } /* - * Helper function for rbdestroy() + * Recursive portion of rbdestroy(). */ -static int -_rbdestroy(v1, v2) - VOID *v1, *v2; +static void +_rbdestroy(tree, node, destroy) + struct rbtree *tree; + struct rbnode *node; + void (*destroy)__P((VOID *)); { - struct rbnode *node = (struct rbnode *) v1; - void (*destroy)__P((VOID *)) = (void (*)__P((VOID *))) v2; - - destroy(node); - free(node); - return(0); + if (node != rbnil(tree)) { + _rbdestroy(tree, node->left, destroy); + _rbdestroy(tree, node->right, destroy); + if (destroy != NULL) + destroy(node->data); + free(node); + } } /* * Destroy the specified tree, calling the destructor destroy - * for each node and then freeing it. + * for each node and then freeing the tree itself. */ void rbdestroy(tree, destroy) struct rbtree *tree; void (*destroy)__P((VOID *)); { - rbapply(tree, _rbdestroy, (VOID *)destroy, postorder); + _rbdestroy(tree, rbfirst(tree), destroy); free(tree); } -- 2.50.1