Пример #1
0
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;
}
Пример #2
0
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;
}