#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
分享到:
相关推荐
开发者需要掌握图像处理技巧,如使用Photoshop或GIMP等工具进行图像编辑,以及在游戏中应用精灵表(Sprite Sheet)技术来优化性能。 3. UI界面:包括游戏的启动页、主菜单、设置界面等,这些都需要设计和制作。...
开发者可能会使用XML或者自定义的类来描述UI布局,同时使用CSS或类似样式表来定义视觉样式。 此外,源码可能还包含了数据存储和加载机制。例如,游戏的分数、最高记录等信息需要保存到本地或云端,以便玩家下次打开...
微信小程序采用WXML(Weixin Markup Language)和WXSS(Weixin Style Sheet)作为标记语言和样式表语言,结合JavaScript来完成业务逻辑和数据处理。 1. **WXML结构分析**: WXML文件是小程序的结构层,类似于HTML...
《H5小游戏源码 我跳我跳我跳跳跳!》是一款基于HTML5技术开发的轻量级娱乐项目,其源代码可供开发者学习和参考。H5小游戏因其跨平台、易于分享和互动性强等特点,近年来在移动互联网领域受到广泛关注。下面我们将...
asp.net 导入excel时,处理合并表头、复杂表头、多行表头 1.解决复杂表头的Excel导入。可以解决任何复杂的表头。 2.导入时,显示请稍后。。。提醒框,完毕后会自动隐藏 3.全面扫描Excel数据,将所有异常详细信息写入...
UTC跳秒信息查询方法与UTC时间转换方法
"Unity3D跳一跳"是一个适合初学者的项目,旨在教授如何利用Unity3D引擎进行游戏开发。在这个项目中,你可以学习到一系列关键的Unity3D技术,包括粒子系统、碰撞检测以及对象的变形效果。下面将详细介绍这些知识点。 ...
2. CSS3:CSS3是层叠样式表的第三个主要版本,它提供了丰富的样式控制和动画效果。在这款游戏中,CSS3用于设计游戏界面的布局、颜色、字体等视觉元素,并通过CSS3的Transition和Animation实现角色跳跃、落地等平滑...
微信小程序是腾讯公司推出的一种轻量级应用开发平台,它基于JavaScript、WXML(微信小程序标记语言)和WXSS(微信小程序样式表)构建,专为移动端设计,旨在提供便捷的用户服务和交互体验。"跳一跳"是微信小程序中的...
本资料包"byjc.zip"包含了与物体边界检测相关的技术,包括表面检测、跳变检测、跳变区域检测和边缘增强等关键概念。 1. **物体边界检测**:这是图像处理的基础步骤,旨在找到图像中灰度值发生显著变化的点,这些点...
通常,源码包内会包含各种文件,如`.wxml`(微信小程序的结构文件)、`.wxss`(样式表文件)、`.js`(JavaScript逻辑文件)以及可能的图片资源等,它们共同构成了“跳一跳”游戏的前端部分。 通过这个源码,开发者...
- 从指定的FTP地址下载最新的表文件,这些文件通常包括太阳历、月历、章动等,以及按月更新的地球自转参数、极移表、跳秒表等。 - 使用提供的用户名(anonymouse)和任意电子邮箱作为密码登录。 - 表文件的命名规则...
这些文件需要根据处理日期进行实时更新,比如UT1和极移参数每周更新一次,跳秒表、太阳星历、月亮星历、章动参数表每年更新一次。 3. 测站相关文件准备:测站相关文件包含测站概略坐标文件、测站信息文件、测站约束...
7. `assets`:资源文件夹,包含了游戏中使用的图像、音频、精灵表等素材。 8. `build`:构建输出目录,包含打包后的游戏文件。 9. `packages`:可能包含了第三方库或者自定义组件,用于扩展游戏功能。 10. `creator....
尤其在开发和生产环境中,表级数据的恢复显得尤为重要,因为关键表往往存放着核心数据,一旦出现数据损坏,需要迅速采取措施进行恢复。本文将详细介绍SQLServer中用于快速恢复表级数据的方法,并对各方案的利弊进行...
这通常是源代码的存放位置,包含了项目的主要逻辑代码,如Vue组件、样式表、JavaScript文件等。在这个项目中,src目录可能包含Vue组件(如游戏板、角色等)、Three.js和Cannon-es的交互逻辑,以及游戏逻辑控制等。 ...
### MX3跳屏问题解决经验教程 #### 一、MX3跳屏问题概述 MX3作为魅族的一款经典智能手机,在长时间使用后可能会遇到各种各样的问题,其中“跳屏”问题是一个较为常见的故障表现。所谓“跳屏”,指的是在没有人为...
社团活动记录表详细记录了每周的活动内容,旨在让学生在不断的训练和实践中,不仅能够掌握多种跳绳技巧,还能在团队互动中培养合作精神与竞技意识。下面将详细解读社团的几项主要活动内容及其意义。 **单人连续跳...