c++实现skip list
来源:互联网 发布:十堰电信网络客服电话 编辑:程序博客网 时间:2024/06/16 04:48
编程实例:
#include <iostream>#include <cstdio>#include <unistd.h>#include <cstdlib>#include <time.h>#define maxLevel 12struct Node{int key;int value;Node* forward[1];};struct skipList{int level;Node* head;};class SkipList{public: SkipList(){srand((int)time(0)); slist = (skipList*)malloc(sizeof(skipList));slist->head = createNode(maxLevel, 0, 0);slist->level = 0;for(int i=0; i<maxLevel; ++i){slist->head->forward[i] = NULL;}}int search(int key){Node *p, *q;p = slist->head;int k = slist->level; for(int i=k; i>=0; --i){while(p->forward[i] != NULL && p->forward[i]->key <= key){if(p->forward[i]->key == key){q = p->forward[i];return q->value;}p = p->forward[i];}}}bool insert(int key, int value){Node *p, *q;Node *update[maxLevel];p = slist->head;int k = slist->level;for(int i = k; i>=0; --i){while(p->forward[i] != NULL && p->forward[i]->key < key){p = p->forward[i];}update[i] = p;}q = p->forward[0];if(q && q->key == key)return false;k = random();if(k > slist->level){for(int i=slist->level; i<=k; ++i){update[i] = slist->head;}slist->level = k;}q = createNode(k, key, value);for(int i = 0; i<=k; ++i){q->forward[i] = update[i]->forward[i];update[i]->forward[i] = q;}printList();}bool remove(int key){Node *update[maxLevel]; Node *p,*q; p = slist->head; int k = slist->level; for(int i = k ; i >=0 ; i --){ while(p->forward[i] != NULL && (p->forward[i]->key < key)){ p = p->forward[i]; } update[i] = p; } q = p->forward[0]; if(q && q->key == key){ for(int i = 0 ; i <= k; ++i){ if(update[i]->forward[i] != q) break; update[i]->forward[i] = q->forward[i]; } free(q); for(int i = slist->level ; i > 0 ; i --){ if(slist->head->forward[i] == NULL){ slist->level --; } }//printList();return true; } else{ return false; } } virtual ~SkipList(){destroy();}private:Node* createNode(int level, int key, int value){Node* node = (Node*)malloc(sizeof(Node) + level*sizeof(Node*));node->key = key;node->value = value;return node;}int random(){int k = 0;while(rand() %2) k++;k = k>maxLevel?maxLevel:k;return k;}void printList(){Node *p,*q; int k=slist->level; for(int i=k; i >= 0; i--) { p = slist->head->forward[i]; printf("level[%d]: ",i); while(p->forward[i] != NULL) { printf("%d -> ",p->value); p = p->forward[i]; } printf("%d\n",p->value); } printf("\n"); }void destroy(){Node *p, *q;int k = slist->level;p = slist->head;for(int i= k; i>=0; --i){while((q = p) !=NULL){free(q);p = p->forward[i];}}free(slist);slist = NULL;}private: skipList* slist;};int main(){SkipList skip;for(int i=1; i<20; ++i){skip.insert(i, 2*i);}int v = skip.search(5);std::cout << v << "\n";skip.remove(5);std::cout << skip.search(5)<< "\n";sleep(2); return 0; }
编译:g++ -g -o testSkip skip.cpp
0 0
- c++实现skip list
- Skip List 实现思路
- skip list跳跃表实现
- skip list跳表C语言代码。
- Skip List跳跃表代码实现
- 跳跃表(skip list) 的实现
- 跳跃表(Skip List)-实现(Java)
- 跳跃表(Skip List)-实现(Java)
- 跳跃表(Skip List)-实现(Java)
- 跳表(Skip List)的JAVA实现
- skip list
- skip list
- Skip List
- Skip list
- Skip List
- Skip List(跳跃表)原理详解与实现
- Skip List(跳跃表)原理详解与实现
- Skip List(跳跃表)原理详解与实现
- C#实现串口数据循环发送
- iptables的DNAT和SNAT
- ADRCI
- 说说JSON和JSONP,也许你会豁然开朗
- JavaScript获取节点类型、节点名称和节点值
- c++实现skip list
- 关于node和grunt安装
- 解决Eclipse官网下的自带Eclipse编辑器不能自动代码提示的问题。
- static final域
- iOS框架介绍——T&U&V&W字头
- DM9000网卡驱动源码分析系列07 - interrupt && read && write
- 树与二叉树
- 带有控制信息的单链表
- AT+CNMI新消息提示