跳表的实现代码参考
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define MAX_LEVEL 8
typedef struct node
{
int key;
int value;
struct node* next[1];
} Node;
typedef struct skip_list
{
int level;
Node* head;
} skip_list;
#define new_node(n) ((Node*)malloc(sizeof(struct node) + n * sizeof(Node*)))
Node* create_node(int level, int key, int value)
{
Node* p = new_node(level);
if (!p) {
return NULL;
}
p->key = key;
p->value = value;
return p;
}
skip_list* create_skip_list()
{
skip_list* sl = (skip_list*)malloc(sizeof(struct skip_list));
if (NULL == sl) {
return NULL;
}
sl->level = 0;
Node* tmp = create_node(MAX_LEVEL, 0, 0);
if (NULL == tmp) {
free(sl);
return NULL;
}
sl->head = tmp;
for (int i = 0; i < MAX_LEVEL; i++) {
tmp->next[i] = NULL;
}
srand(time(NULL));
return sl;
}
int randomLevel()
{
int level = 1;
while(rand() % 2) {
level++;
}
cout << "rand level: " << level << endl;
level = (MAX_LEVEL > level ? level : MAX_LEVEL);
return level;
}
bool insert(skip_list* sl, int key, int value)
{
Node* update[MAX_LEVEL];
Node* q = NULL, *p = sl->head;
int i = sl->level-1;
for (; i >= 0; i--) {
while((q = p->next[i]) && q->key < key) {
p = q;
}
update[i] = p;
}
if (q && q->key == key) {
q->value = value;
return true;
}
int level = randomLevel();
if (level > sl->level) {
for (i = sl->level; i < level; i++) {
update[i] = sl->head;
}
sl->level = level;
}
q = create_node(level, key, value);
if (!q) {
return false;
}
for (i = level - 1; i >= 0; i--) {
q->next[i] = update[i]->next[i];
update[i]->next[i] = q;
}
return true;
}
bool erase(skip_list* sl, int key)
{
Node* update[MAX_LEVEL];
Node* q = NULL, *p = sl->head;
int i = sl->level - 1;
for (; i >= 0; i--) {
while((q = p->next[i]) && q->key < key) {
p = q;
}
update[i] = p;
}
if (!q || (q && q->key != key)) {
return false;
}
for (i = sl->level - 1; i >= 0; i--) {
if (update[i]->next[i] == q) {
update[i]->next[i] = q->next[i];
if (sl->head->next[i] == NULL) {
sl->level--;
}
}
}
free(q);
q = NULL;
return true;
}
int* search(skip_list* sl, int key)
{
Node* q = NULL, *p = sl->head;
int i = sl->level - 1;
for (; i >= 0; i--) {
while((q = p->next[i]) && q->key < key) {
p = q;
}
if (q && key == q->key) {
return &(q->value);
}
}
return NULL;
}
void skip_list_destroy(skip_list* sl)
{
if (!sl) {
return;
}
Node* q = sl->head;
Node* next = NULL;
while(q) {
next = q->next[0];
free(q);
q = next;
}
free(sl);
}
void print_skip_list(skip_list* sl)
{
cout << "print the skip_list ......" << endl;
Node* head = sl->head;
while(head) {
cout << head->key << endl;
head = head->next[0];
}
}
int main()
{
skip_list* sl = create_skip_list();
for (int i = 1; i < 10; i++) {
insert(sl, i, i);
}
print_skip_list(sl);
int* p = search(sl, 8);
if (p) {
cout << "88 found." << endl;
}
cout << "the skip_list level: " << sl->level << endl;
return 0;
}