| 188 | } |
| 189 | |
| 190 | sTree_tuple *splay_delete_t(splay_key_type_t i, sTree_tuple *t) { |
| 191 | if (t == NULL) return NULL; |
| 192 | |
| 193 | t = splay_t(i, t); |
| 194 | |
| 195 | sTree_tuple *current = t; |
| 196 | sTree_tuple *parent = NULL; |
| 197 | |
| 198 | // Iterate until find the node to delete |
| 199 | while (current != NULL) { |
| 200 | if (key_cmp_t(i, current->key) == 0 && i->L == current->key->L) { |
| 201 | sTree_tuple *replacement; |
| 202 | |
| 203 | if (current->left == NULL) { |
| 204 | replacement = current->right; |
| 205 | } else if (current->right == NULL) { |
| 206 | replacement = current->left; |
| 207 | } else { |
| 208 | sTree_tuple *successor = current->right; |
| 209 | while (successor->left != NULL) { |
| 210 | successor = successor->left; |
| 211 | } |
| 212 | replacement = splay_t(successor->key, current->right); |
| 213 | replacement->left = current->left; |
| 214 | } |
| 215 | |
| 216 | if (parent == NULL) { |
| 217 | t = replacement; |
| 218 | } else if (parent->left == current) { |
| 219 | parent->left = replacement; |
| 220 | } else { |
| 221 | parent->right = replacement; |
| 222 | } |
| 223 | |
| 224 | free_node_t(current); |
| 225 | |
| 226 | if (t != NULL) { |
| 227 | t->value = node_value_t(t->left) + node_value_t(t->right) + 1; |
| 228 | } |
| 229 | |
| 230 | break; |
| 231 | } |
| 232 | |
| 233 | parent = current; |
| 234 | if (key_cmp_t(i, current->key) < 0 || (key_cmp_t(i, current->key) == 0 && i->L < current->key->L)) |
| 235 | current = current->left; |
| 236 | else |
| 237 | current = current->right; |
| 238 | } |
| 239 | |
| 240 | return t; |
| 241 | } |
| 242 | |
| 243 | // sTree_tuple *find_node(key_type_t e, sTree_tuple *t) { |
| 244 | // /* Returns a pointer to the node in the sTree with the given value. */ |
no test coverage detected