SkipList 跳表



一个跳跃表的简单实现,具体的解释参看:

http://kenby.iteye.com/blog/1187303


相关操作的时间复杂度:
      查找:  O(logn)    (期望)
      插入:  O(logn)    (期望)
      删除:  O(logn)    (期望)


typedef struct SkipListNode_
{
    int data;
    struct SkipListNode_ *next;
    struct SkipListNode_ *down;
}SkipListNode;

typedef struct SkipList_
{
    SkipListNode *top;
    int level;
}SkipList;

int skiplist_init(SkipList *sl)
{
    SkipListNode *new_node;
    if((new_node = (SkipListNode *)malloc(sizeof(SkipListNode))) == NULL)
        return -1;
    new_node->next = NULL;
    new_node->down = NULL;

    sl->level = 1;
    sl->top = new_node;
    return 0;
}


int skiplist_insert(SkipList *sl, int data, int k)
{
    SkipListNode *tmp;
    if(k > sl->level)
    {
        SkipListNode *top_new;
        if((top_new = (SkipListNode *)malloc(sizeof(SkipListNode))) == NULL)
            return -1;
        top_new->next = NULL;
        top_new->down = sl->top;

        sl->top = top_new;
        sl->level++;

        tmp = sl->top;
    }
    else
    {
        int i = 0;
        tmp = sl->top;
        while(i++ < (sl->level - k))
            tmp = tmp->down;
    }

    SkipListNode *new_node;
    SkipListNode *prev = NULL;
    while(tmp != NULL)
    {
        while(tmp->next != NULL && tmp->next->data < data)
            tmp = tmp->next;
        if((new_node = (SkipListNode *)malloc(sizeof(SkipListNode))) == NULL)
            return -1;
        new_node->data = data;
        new_node->next = tmp->next;
        new_node->down = NULL;

        if(prev != NULL)
            prev->down = new_node;
        prev = new_node;

        tmp->next = new_node;
        tmp = tmp->down;
    }

    return 0;
}

SkipListNode * skiplist_find(SkipList *sl, int data)
{
    SkipListNode *tmp = sl->top;
    while(tmp != NULL)
    {
        while(tmp->next != NULL && tmp->next->data < data)
            tmp = tmp->next;
        if(tmp->next != NULL && tmp->next->data == data)
            return tmp->next;
        else
            tmp = tmp->down;
    }

    return NULL;
}

int skiplist_delete(SkipList *sl, int data)
{
    SkipListNode *tmp = sl->top;
    bool flag = false;
    while(tmp != NULL)
    {
        while(tmp->next != NULL && tmp->next->data < data)
            tmp = tmp->next;
        if(tmp->next != NULL && tmp->next->data == data)
        {
            SkipListNode *del = tmp->next;
            tmp->next = tmp->next->next;
            free(del);
            del = NULL;
            flag = true;
        }
        tmp = tmp->down;
    }
    if(flag == true)
        return 0;
    else
        return -1;
}


测试如下:

int main()
{
    SkipList *sl;
    if(skiplist_init(sl) == -1)
    {
        printf("Can't init s1...\n");
    }

    skiplist_insert(sl, 2, 1);
    cout<<"level = ";
    cout<<sl->level<<endl;
    skiplist_insert(sl, 4, 2);
    cout<<"level = ";
    cout<<sl->level<<endl;
    skiplist_insert(sl, 8, 3);
    cout<<"level = ";
    cout<<sl->level<<endl;

    int num = 8;
    SkipListNode *tmp = skiplist_find(sl, num);
    if(tmp != NULL)
    {
        if(tmp->data == num)
            printf("Find it...\n");
        else
            printf("Find it, but not equal...\n");
    }
    else
        printf("Can't find it...\n");

    num = 4;
    if(skiplist_delete(sl, num) == -1)
    {
        printf("Can't delete s1...\n");
    }
    else
    {
        tmp = skiplist_find(sl, num);
        if(tmp != NULL)
            printf("Delete failed...\n");
        else
            printf("Delete success...\n");
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值