[core] splaytree: splaytree_delete_splayed_node()

This commit is contained in:
Glenn Strauss 2023-09-11 11:57:53 -04:00
parent 1eb60deb9f
commit 21f6343e00
2 changed files with 22 additions and 15 deletions

View File

@ -138,22 +138,24 @@ splay_tree * splaytree_insert(splay_tree * t, int i, void *data) {
return new;
}
__attribute_noinline__
__attribute_nonnull__()
splay_tree * splaytree_delete_splayed_node(splay_tree *t) {
/* Deletes (already) splayed node at the root of tree. */
/* Return a pointer to the resulting tree. */
splay_tree * x = t->right;
if (t->left != NULL) {
x = splaytree_splay_nonnull(t->left, t->key);
x->right = t->right;
}
free(t);
return x;
}
splay_tree * splaytree_delete(splay_tree *t, int i) {
/* Deletes i from the tree if it's there. */
/* Return a pointer to the resulting tree. */
if (t != NULL)
t = splaytree_splay_nonnull(t, i);
if (t != NULL && i == t->key) { /* found it */
splay_tree * x;
if (t->left == NULL) {
x = t->right;
} else {
x = splaytree_splay_nonnull(t->left, i);
x->right = t->right;
}
free(t);
return x;
} else {
return t; /* It wasn't there */
}
return (t != NULL && (t = splaytree_splay_nonnull(t, i))->key == i)
? splaytree_delete_splayed_node(t)
: t;
}

View File

@ -18,7 +18,12 @@ static inline splay_tree * splaytree_splay (splay_tree *t, int key) {
return splaytree_splay_nonnull(t, key);
}
__attribute_returns_nonnull__
splay_tree * splaytree_insert(splay_tree *t, int key, void *data);
__attribute_nonnull__()
splay_tree * splaytree_delete_splayed_node(splay_tree *t);
splay_tree * splaytree_delete(splay_tree *t, int key);