+ tree->count++;
+}
+
+splay_node_t *splay_insert(splay_tree_t *tree, void *data) {
+ splay_node_t *closest, *new;
+ int result;
+
+ if(!tree->root) {
+ new = splay_alloc_node();
+ new->data = data;
+ splay_insert_top(tree, new);
+ } else {
+ closest = splay_search_closest_node(tree, data, &result);
+
+ if(!result) {
+ return NULL;
+ }
+
+ new = splay_alloc_node();
+ new->data = data;
+
+ if(result < 0) {
+ splay_insert_before(tree, closest, new);
+ } else {
+ splay_insert_after(tree, closest, new);
+ }
+ }
+
+ return new;
+}
+
+splay_node_t *splay_insert_node(splay_tree_t *tree, splay_node_t *node) {
+ splay_node_t *closest;
+ int result;
+
+ node->left = node->right = node->parent = node->next = node->prev = NULL;
+
+ if(!tree->root) {
+ splay_insert_top(tree, node);
+ } else {
+ closest = splay_search_closest_node(tree, node->data, &result);
+
+ if(!result) {
+ return NULL;
+ }
+
+ if(result < 0) {
+ splay_insert_before(tree, closest, node);
+ } else {
+ splay_insert_after(tree, closest, node);
+ }
+ }
+
+ return node;