Tekkaman

导航

 

SkipList

1、插入操作。

  由于跳表数据结构整体上是有序的,所以在插入时,需要首先查找到合适的位置,然后就是修改指针(和链表中操作类似),然后更新跳表的level变量。

  

  

boolean insert(l,key,value) 
    register list l;
    register keyType key;
    register valueType value;
{
  register int k;
  // 使用了update数组
  node update[MaxNumberOfLevels];
  register node p,q;
  p = l->header;
  k = l->level;
  /*******************1步*********************/
  do {
        // 查找插入位置
        while (q = p->forward[k], q->key < key)
            p = q;
        
        // 设置update数组
        update[k] = p;
    } while(--k>=0);    // 对于每一层进行遍历
    
    // 这里已经查找到了合适的位置,并且update数组已经
    // 填充好了元素
   if (q->key == key)
   {
     q->value = value;
     return(false);
   };
    
   // 随机生成一个层数
   k = randomLevel();  
  if (k>l->level) 
  {
      // 如果新生成的层数比跳表的层数大的话
    // 增加整个跳表的层数
    k = ++l->level;
    // 在update数组中将新添加的层指向l->header
    update[k] = l->header;
  };
        
  /*******************2步*********************/
  // 生成层数个节点数目
  q = newNodeOfLevel(k);
  q->key = key;
  q->value = value;
      
  // 更新两个指针域
  do 
  {
        p = update[k];
        q->forward[k] = p->forward[k];
        p->forward[k] = q;
    } while(--k>=0);
    
    // 如果程序运行到这里,程序已经插入了该节点
  return(true);
} 

 2、删除某个节点。

  和插入是相同的,首先查找需要删除的节点,如果找到了该节点的话,那么只需要更新指针域,如果跳表的level需要更新的话,进行更新。

  

参考:http://www.cnblogs.com/xuqiang/archive/2011/05/22/2053516.html

posted on 2015-10-14 15:27  Tekkaman  阅读(239)  评论(0编辑  收藏  举报