`

跳 表

 
阅读更多
#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 &current->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小游戏源码 我跳我跳我跳跳跳!.zip

    《H5小游戏源码 我跳我跳我跳跳跳!》是一款基于HTML5技术开发的轻量级娱乐项目,其源代码可供开发者学习和参考。H5小游戏因其跨平台、易于分享和互动性强等特点,近年来在移动互联网领域受到广泛关注。下面我们将...

    导入excel,处理合并表头、复杂表头、多行表头

    asp.net 导入excel时,处理合并表头、复杂表头、多行表头 1.解决复杂表头的Excel导入。可以解决任何复杂的表头。 2.导入时,显示请稍后。。。提醒框,完毕后会自动隐藏 3.全面扫描Excel数据,将所有异常详细信息写入...

    UTC跳秒信息查询方法与UTC时间转换方法

    UTC跳秒信息查询方法与UTC时间转换方法

    unity3D跳一跳

    "Unity3D跳一跳"是一个适合初学者的项目,旨在教授如何利用Unity3D引擎进行游戏开发。在这个项目中,你可以学习到一系列关键的Unity3D技术,包括粒子系统、碰撞检测以及对象的变形效果。下面将详细介绍这些知识点。 ...

    HTML微信跳一跳源码-亲测(全).zip

    2. CSS3:CSS3是层叠样式表的第三个主要版本,它提供了丰富的样式控制和动画效果。在这款游戏中,CSS3用于设计游戏界面的布局、颜色、字体等视觉元素,并通过CSS3的Transition和Animation实现角色跳跃、落地等平滑...

    微信小程序之跳一跳源码

    微信小程序是腾讯公司推出的一种轻量级应用开发平台,它基于JavaScript、WXML(微信小程序标记语言)和WXSS(微信小程序样式表)构建,专为移动端设计,旨在提供便捷的用户服务和交互体验。"跳一跳"是微信小程序中的...

    byjc.zip_物体边界检测_表面检测_跳变_跳变区域检测_边缘增强

    本资料包"byjc.zip"包含了与物体边界检测相关的技术,包括表面检测、跳变检测、跳变区域检测和边缘增强等关键概念。 1. **物体边界检测**:这是图像处理的基础步骤,旨在找到图像中灰度值发生显著变化的点,这些点...

    VX小程序跳一跳源码亲测可用,没有套路

    通常,源码包内会包含各种文件,如`.wxml`(微信小程序的结构文件)、`.wxss`(样式表文件)、`.js`(JavaScript逻辑文件)以及可能的图片资源等,它们共同构成了“跳一跳”游戏的前端部分。 通过这个源码,开发者...

    gamit数据处理流程

    - 从指定的FTP地址下载最新的表文件,这些文件通常包括太阳历、月历、章动等,以及按月更新的地球自转参数、极移表、跳秒表等。 - 使用提供的用户名(anonymouse)和任意电子邮箱作为密码登录。 - 表文件的命名规则...

    GAMIT软件GPS测量数据处理流程及常见问题分析和处理.pdf

    这些文件需要根据处理日期进行实时更新,比如UT1和极移参数每周更新一次,跳秒表、太阳星历、月亮星历、章动参数表每年更新一次。 3. 测站相关文件准备:测站相关文件包含测站概略坐标文件、测站信息文件、测站约束...

    跳一跳cocosCreator(2.3.1)+JavaScript源码

    7. `assets`:资源文件夹,包含了游戏中使用的图像、音频、精灵表等素材。 8. `build`:构建输出目录,包含打包后的游戏文件。 9. `packages`:可能包含了第三方库或者自定义组件,用于扩展游戏功能。 10. `creator....

    SQLServer恢复表级数据详解

    尤其在开发和生产环境中,表级数据的恢复显得尤为重要,因为关键表往往存放着核心数据,一旦出现数据损坏,需要迅速采取措施进行恢复。本文将详细介绍SQLServer中用于快速恢复表级数据的方法,并对各方案的利弊进行...

    ThreeJS+Cannon-ES 跳一跳

    这通常是源代码的存放位置,包含了项目的主要逻辑代码,如Vue组件、样式表、JavaScript文件等。在这个项目中,src目录可能包含Vue组件(如游戏板、角色等)、Three.js和Cannon-es的交互逻辑,以及游戏逻辑控制等。 ...

    MX3跳屏解决经验教程

    ### MX3跳屏问题解决经验教程 #### 一、MX3跳屏问题概述 MX3作为魅族的一款经典智能手机,在长时间使用后可能会遇到各种各样的问题,其中“跳屏”问题是一个较为常见的故障表现。所谓“跳屏”,指的是在没有人为...

    沙建中心小学炫跳花样跳绳社团活动记录表.doc

    社团活动记录表详细记录了每周的活动内容,旨在让学生在不断的训练和实践中,不仅能够掌握多种跳绳技巧,还能在团队互动中培养合作精神与竞技意识。下面将详细解读社团的几项主要活动内容及其意义。 **单人连续跳...

Global site tag (gtag.js) - Google Analytics