void FreeTestData() { FREE_NODE(NodeA); FREE_NODE(NodeB); FREE_NODE(NodeC); FREE_NODE(NodeD); FREE_NODE(NodeE); FREE_NODE(NodeF); }
////////////////////////////////////////////// // Delete entire family tree ///////////////////////////////////////////// void deleteFam(node* n) { node *tmp; int i; while (n) { tmp = n; n = n->descendant; tmp->deleted = 1; tmp->mark = NOT_QUEUED; tmp->descendant = NULL; for(i=0;i<MAX_DEGREE;i++) { tmp->scars[i].backscar=NULL; tmp->scars[i].cl = NULL; } FREE_NODE(tmp); } }
int hb_tree_remove(hb_tree *tree, const void *key, int del) { int rv, left; hb_node *node, *out, *parent = NULL; void *tmp; ASSERT(tree != NULL); node = tree->root; while (node) { rv = tree->key_cmp(key, node->key); if (rv == 0) break; parent = node; node = rv < 0 ? node->llink : node->rlink; } if (node == NULL) return -1; if (node->llink && node->rlink) { for (out = node->rlink; out->llink; out = out->llink) /* void */; SWAP(node->key, out->key, tmp); SWAP(node->dat, out->dat, tmp); node = out; parent = out->parent; } out = node->llink ? node->llink : node->rlink; FREE_NODE(node); if (out) out->parent = parent; if (parent == NULL) { tree->root = out; tree->count--; return 0; } left = parent->llink == node; if (left) parent->llink = out; else parent->rlink = out; for (;;) { if (left) { if (++parent->bal == 0) { node = parent; goto higher; } if (parent->bal == +2) { ASSERT(parent->rlink != NULL); if (parent->rlink->bal < 0) { rot_right(tree, parent->rlink); rot_left(tree, parent); } else { ASSERT(parent->rlink->rlink != NULL); if (rot_left(tree, parent) == 0) break; } } else { break; } } else { if (--parent->bal == 0) { node = parent; goto higher; } if (parent->bal == -2) { ASSERT(parent->llink != NULL); if (parent->llink->bal > 0) { rot_left(tree, parent->llink); rot_right(tree, parent); } else { ASSERT(parent->llink->llink != NULL); if (rot_right(tree, parent) == 0) break; } } else { break; } } /* Only get here on double rotations or single rotations that changed * subtree height - in either event, `parent->parent' is positioned * where `parent' was positioned before any rotations. */ node = parent->parent; higher: if ((parent = node->parent) == NULL) break; left = parent->llink == node; } tree->count--; return 0; }