* splay-tree.c (splay_tree_remove): New.

This commit is contained in:
Richard Henderson 2000-04-06 00:16:01 +00:00
parent 2664c1f9fa
commit afe36a788b
2 changed files with 45 additions and 0 deletions

View File

@ -1,3 +1,7 @@
2000-04-05 Richard Henderson <rth@cygnus.com>
* splay-tree.c (splay_tree_remove): New.
Thu Mar 16 01:33:58 2000 Jeffrey A Law (law@cygnus.com) Thu Mar 16 01:33:58 2000 Jeffrey A Law (law@cygnus.com)
* Makefile.in (partition.o): Depend on config.h * Makefile.in (partition.o): Depend on config.h

View File

@ -309,6 +309,47 @@ splay_tree_insert (sp, key, value)
return sp->root; return sp->root;
} }
/* Remove KEY from SP. It is not an error if it did not exist. */
void
splay_tree_remove (sp, key)
splay_tree sp;
splay_tree_key key;
{
splay_tree_splay (sp, key);
if (sp->root && (*sp->comp) (sp->root->key, key) == 0)
{
splay_tree_node left, right;
left = sp->root->left;
right = sp->root->right;
/* Delete the root node itself. */
if (sp->delete_value)
(*sp->delete_value) (sp->root->value);
free (sp->root);
/* One of the children is now the root. Doesn't matter much
which, so long as we preserve the properties of the tree. */
if (left)
{
sp->root = left;
/* If there was a right child as well, hang it off the
right-most leaf of the left child. */
if (right)
{
while (left->right)
left = left->right;
left->right = right;
}
}
else
sp->root = right;
}
}
/* Lookup KEY in SP, returning VALUE if present, and NULL /* Lookup KEY in SP, returning VALUE if present, and NULL
otherwise. */ otherwise. */