int skiplist_delete(skiplist *list, int key) { int i; snode *update[SKIPLIST_MAX_LEVEL + 1]; snode *x = list->header; for (i = list->level; i >= 1; i--) { while (x->forward[i]->key < key) x = x->forward[i]; update[i] = x; } x = x->forward[1]; if (x->key == key) { for (i = 1; i <= list->level; i++) { if (update[i]->forward[i] != x) break; update[i]->forward[1] = x->forward[i]; } skiplist_node_free(x); while (list->level > 1 && list->header->forward[list->level] == list->header) list->level--; return 0; } return 1; }
int skiplist_delete_raw(SkipList *list, unsigned char *key, int(* cmp)(unsigned char *, unsigned char *), void(* del)(void *)) { int i; Node *update[SKIPLIST_MAX_LEVEL + 1]; Node *x = list->header; for(i = list->level; i >= 1; i--) { while(cmp(x->forward[i]->key, key) < 0) { x = x->forward[i]; } update[i] = x; } x = x->forward[1]; if (cmp(x->key, key) == 0) { for (i = 1; i <= list->level; i++) { if (update[i]->forward[i] != x) { break; } update[i]->forward[i] = x->forward[i]; } skiplist_node_free(x, del); while(list->level > 1 && list->header->forward[list->level] == list->header) list->level--; return 0; } return 1; }