* splay-tree.c (splay_tree_remove): New.
This commit is contained in:
parent
2664c1f9fa
commit
afe36a788b
@ -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)
|
||||
|
||||
* Makefile.in (partition.o): Depend on config.h
|
||||
|
@ -309,6 +309,47 @@ splay_tree_insert (sp, key, value)
|
||||
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
|
||||
otherwise. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user