Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20282
  • 博文数量: 14
  • 博客积分: 433
  • 博客等级: 下士
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-16 23:07
文章分类

全部博文(14)

文章存档

2012年(14)

最近访客

分类: C/C++

2012-06-26 11:44:59


点击(此处)折叠或打开

  1. /*Author: wangjianping@earth
  2.  *Date:2012-06-26
  3.  *BSD Licence
  4.  */

  5. #include <iostream>
  6. #include <cstring>
  7. #include <stdlib.h>
  8. #include <stdint.h>

  9. using namespace std;

  10. typedef enum {add, del} operation;
  11. class SkipNode{
  12.     public:
  13.         uint64_t val;
  14.         unsigned opt:24;
  15.         int level;
  16.         string key;
  17.         SkipNode **next;
  18.         SkipNode(int level){
  19.             next = new SkipNode *[level];
  20.         }

  21. };
  22.     

  23. class SkipList{
  24.     private:
  25.         int count;
  26.         int size;
  27.         int MaxLevel;
  28.         SkipNode *entry;//The entry of the skplist
  29.     public:
  30.         SkipList(int size);
  31.         bool SkipListInsert(string key, uint64_t val, operation opt);
  32.         SkipNode *SkipNodeSearch(string data);
  33.         //friend int main();

  34. };

  35. SkipList::SkipList(int size){
  36.     size = size;//The maximum skipnode number
  37.     count = 0;
  38.     MaxLevel = 0;
  39.     entry = new SkipNode(16);

  40.     for(int i = 0; i <= 15; i++)
  41.         entry->next[i] = entry;
  42. }

  43. bool SkipList::SkipListInsert(string key, uint64_t val, operation opt){
  44.     SkipNode *temp[16];//Maximum level of skipnode
  45.     SkipNode *x;
  46.     int NewLevel;

  47.     if(count == size)//skiplist is full
  48.         return false;
  49.     
  50.     //locate the proper postion
  51.     x = entry;
  52.     for(int i = MaxLevel; i>=0; i--){
  53.         while(x->next[i] != entry && x->next[i]->key < key)//look forward
  54.             x = x->next[i];//jump
  55.         temp[i] = x;
  56.     }

  57.     x = x->next[0];
  58.     if(x != entry && x->key == key){//redundancy
  59.         x->val = val;
  60.         x->opt = opt;
  61.         return false;
  62.     }

  63.     //Generate the new level
  64.     for(NewLevel = 0; rand() < RAND_MAX/2 && NewLevel < 15; NewLevel++);
  65.     //Set the upper level if necessary
  66.     if(NewLevel > MaxLevel){
  67.         for(int i = MaxLevel + 1; i <= NewLevel; i++)
  68.             temp[i] = entry;//set the upper levels point to the entry
  69.         MaxLevel = NewLevel;
  70.     }

  71.     //form the skipnode
  72.     x = new SkipNode(NewLevel + 1);
  73.     x->key = key;
  74.     x->val = val;
  75.     x->opt = opt;

  76.     //Place all level pointers
  77.     for(int i = 0; i <= NewLevel; i++){
  78.         x->next[i] = temp[i]->next[i];
  79.         temp[i]->next[i] = x;
  80.     }

  81.     count++;
  82.     return true;
  83. }


  84. SkipNode *SkipList::SkipNodeSearch(string data){
  85.     SkipNode *x = entry;
  86.     //from the top level
  87.     for(int i = MaxLevel; i >= 0; i--){
  88.         while(x->next[i] != entry && x->next[i]->key < data)
  89.             x = x->next[i];//move forward
  90.     }
  91.     x = x->next[0];
  92.     if(x != entry && x->key == data)
  93.         return x;
  94.     return NULL;
  95. }

  96. int main(){
  97.     SkipList sl(1000);
  98.     sl.SkipListInsert("123",123,add);
  99.     sl.SkipListInsert("234",234,del);
  100.     sl.SkipListInsert("345",345,add);
  101.     sl.SkipListInsert("456",456,add);

  102.     for(SkipNode *it = sl.entry->next[0]; it != sl.entry; it = it->next[0])
  103.         cout<<it->val<<endl;


  104.     return 0;
  105. }

阅读(271) | 评论(0) | 转发(0) |
0

上一篇:operator<< overloading with template

下一篇:shell

给主人留下些什么吧!~~