#ifndef SKIPLIST_H
#define SKIPLIST_H
#include<iostream>
#include<assert.h>
const int DefaultSize = 100;
template<typename E,typename K>
class SkipNode{
E data;
SkipNode<E,K> **link;
SkipNode(int size=DefaultSize){
link = new SkipNode<E,K>*[size];
assert(link!=NULL);
}
};
template<typename E,typename K>
class SkipList{
public:
SkipList(K large,int maxLev=DefaultSize);
~SkipList();
bool Search(const K k1,E& e1)const;
E& getData(SkipNode<E,K>* current){
if(current!=NULL)
return ¤t->data;
else
return NULL;
}
bool Insert(const K k1,E& e1);
bool Remove(const K k1,E& e1);
private:
int maxLevel;//所允许的最大级数
int Levels;//当前非空链的级数
K TailKey;//在TailKey中存有一个大值
SkipNode<E,K> *head;//附加头结点
SkipNode<E,K> *tail;//附加尾结点
SkipNode<E,K> **last;//指针数组
int level();
SkipNode<E,K> *SaveSearch(const K k1);
};
template<typename E,typename K>
SkipList<E,K>::SkipList(K large, int maxLev)
{
maxLevel = maxLev;
TailKey = large;
Levels = 0;
head = new SkipNode<E,K>(maxLevel+1);//附加头结点,有maxLevel+1个指针
tail = new SkipNode<E,K>(0);
last = new SkipNode<E,K> *[maxLevel+1];
tail->data = large;
for(int i=0;i<=maxLevel;i++)
head->link[i]=tail;
}
template<typename E,typename K>
SkipList<E,K>::~SkipList()
{
SkipNode<E,K> *next;
while(head!=tail){
next = head->link[0];
delete head;
head = next;
}
delete tail;
delete []last;
}
template<typename E,typename K>
bool SkipList<E,K>::Search(const K k1, E &e1) const
{
if(k1>TailKey)
return false;
SkipNode<E,K> *p = head;
for(int i=Levels;i>=0;i--){
while(p->link[i]->data<k1)
p = p->link[i];
}
el = p->link[0]->data;
return e1==k1?true:false;
}
template<typename E,typename K>
SkipNode<E,K> *SkipList<E,K>::SaveSearch(const K k1)
{
if(k1>TailKey)
return NULL;
SkipNode<E,K> *p = head;
for(int i=Levels;i>=0;i--){
while(p->link[i]->data<k1)
p = p->link[i];
last[i]=p;
}
return p->link[0];
}
template<typename E,typename K>
int SkipList<E,K>::Level()
{
int lev=0;
while(rand()<=RAND_MAX/2)
lev++;
return lev<maxLevel?lev:maxLevel;
}
template<typename E,typename K>
bool SkipList<E,K>::Insert(const K k1, E &e1)
{
if(k1>=TailKey){
cerr << "关键码太大" << endl;
return false;
}
SkipNode<E,K> *p = SaveSearch(k1);
if(p->data==e1){
cerr << "关键码重复" << endl;
}
int lev = Level();
if(lev>Levels){
lev = ++Levels;
last[lev]=head;
}
SkipNode<E,K> *newNode = new SkipNode<E,K>(lev+1);
newNode->data = e1;
for(int i=0;i<=lev;i++){
newNode->link[i]=last[i]->link[i];
last[i]->link[i] = newNode;
}
return true;
}
template<typename E,typename K>
bool SkipList<E,K>::Remove(const K k1, E &e1)
{
if(k1>TailKey){
cerr << "关键码太大!" << endl;
return false;
}
SkipNode<E,K> *p = SaveSearch(k1);
if(p->data!=k1){
cerr << "被删除元素不存在!"<<endl;
return false;
}
for(int i=0;i<=Levels&&&last[i]->link[i]==p;i++)
last[i]->link[i] = p->link[i];
while(Levels>0&&head->link[Levels]==tail)
Levels--;
e1 = p->data;
delete p;
return true;
}
#endif // SKIPLIST_H
分享到:
相关推荐
hop-expression:跳表达语言和转换插件
好用的秒表 记住你的心跳 生活少不了的细微的记录
UTC跳秒信息查询方法与UTC时间转换方法
asp.net 导入excel时,处理合并表头、复杂表头、多行表头 1.解决复杂表头的Excel导入。可以解决任何复杂的表头。 2.导入时,显示请稍后。。。提醒框,完毕后会自动隐藏 3.全面扫描Excel数据,将所有异常详细信息写入...
传统的单径路由方式对于转发信息表(forwarding information base,FIB)的聚合和压缩的作用已不大,为此提出一种基于后缀摘要的可选下一跳转发信息表聚合方法。一方面,将多可选下一跳的路由方式引入到转发信息表...
图像边缘检测主要用于增强图像中的轮廓边缘、细节以及灰度跳变部分,形成完整的物体边界,达到将物体从图像中分离出来或将表示同一物体表面的区域检测出来的目的。
传说中的跳链表,网上有相关的内容介绍,这里只有源码,内容不是很复杂,当然源码也不是我写的,是从开源工程下载的;
作品:proteus仿真--基于单片机的脉搏心跳检测设计 使用材料:STM32F103、数码管、LCD、按键 平台:proteus 和 keil 技术实现:按键模拟人的脉搏,每按下一次按键,则相当于心跳一次,心跳的次数用数码管显示,...
主要介绍了SQLServer中用于快速恢复表,而不是库,但是切记,防范总比亡羊补牢好,需要的朋友可以参考下
沙建中心小学炫跳花样跳绳社团活动记录表.doc
此系列例程演示了多线程TCP挂机 心跳的多种方案*被动心跳(并发型)*主动心跳(并发型)*实时数据展示*实时状态展示*回应包同步方案*连接附加数据管理方案 数组/哈希表*HTTP/HTTPS,SOSKS5代理按连接分配方案各版本差异:...
跳高成绩登记表定义.pdf
14题:集合运算。输入:两个链表,每个链表均为若干个有序正整数(单个链表中无重复数字), ...另外,题目中要求链表带辅助表元,那这里就不强制要求了,自行决定。要注意两个链表中,有一个或者两个空链表的情况。
AndroidWearSensorLoggor 语言与环境 Android AndroidStudio下开发 英文简介 ...This is a Smart Watch Sensor Loggor. It can record the sensor data of the Android watch/phone, such as: ...
针对视频数据噪声及计算误差造成重建流体高度场时域跳变的问题,提出一种视频数据驱动的流体表面模型生成方法。首先,在折射的流体表面重建算法基础上,利用水下场景视频数据生成初始流体表面高度场;其次,为了提高...
现在很多应用都会在让用户输入各种文本信息的时候同时多提供一个表情面板,这样就会出现一个问题,即表情面板的跳闪问题要输入文本信息,那固然是需要弹出软键盘,在软键盘显示的情况下,此时如果要切换显示出表情...
实验报告表7-4路由器是如何确定进行转发的下一跳路径的 北理大学计算机实验基础-实验七实验报告表全文共2页,当前为第2页。 北理大学计算机实验基础-实验七实验报告表全文共2页,当前为第1页。 路由器IP 目标网络 ...
01) >AGGRE_ERROR_INFO_DDL.SQL 如果日志表AGGRE_ERROR_INFO已经存在,该步骤跳过。 02) >GET_MILLISECOND.SQL 如果函数GET_MILLISECOND已经存在,该步骤跳过。 03) >GET_DATE_FROM_MILLISECOND.SQL 如果函数GET_...
"用到了Excel中的宏,具体操作: ... office2007以及以后版本:打开时直接选择... ⑶、如果选“打印选定工资单”,除进行 第⑵项 设置外,还要进行 “指定打印行”,选择方法同上(在选择时,可以按住CTRL键进行跳选)