一个跳跃表的简单实现,具体的解释参看:
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");
}
}