跳跃表

2023-11-12

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX_LEN 2000
typedef struct node
{
    int key;
    int value;
    struct node* next[];
}Node;

typedef struct list
{
    int level;
    struct node* head;
}List;

Node* CreateNode(int level,int key,int value)
{
    int i;
    Node *p=(Node*)malloc(sizeof(Node)+(level+1)*sizeof(Node*));
    if(p==NULL)
    {
        printf("No enough memory !\n");
        exit(0);
    }
    p->key=key;
    p->value=value;
    for(i=0;i<=level;i++)
        p->next[i]=NULL;

    return p;
}

List* Create()
{
    List *p;
    p=(List*)malloc(sizeof(List));
    if(p==NULL)
    {
        printf("No enough memory !\n");
        exit(0);
    }
    p->level=0;
    p->head=CreateNode(0,-1,-1);

    return p;
}

void Menu()
{
    printf(" \n\n跳跃表可执行操作如下\n");
    printf("1. 添加新节点\n");
    printf("2. 删除旧节点\n");
    printf("3. 查找节点\n");
    printf("4. 打印跳跃表\n");
    printf("5. 退出\n");
    printf("\n请输入执行的操作:\n");
}

int Random_Level(List* skiplist)
{
    int level=0;
    srand((int)time(0));
    while(rand()%2)
    {
        level++;
    }
    if(level>(skiplist->level))
        level=(skiplist->level)+1;

    return level;
}

void InsertNode(List* skiplist,int key,int value)
{
    int i=0,level=0,flag=0;
    Node *p=skiplist->head,*update[MAX_LEN],*q=NULL,*m=NULL;
    level=Random_Level(skiplist);
    if(level>(skiplist->level))
    {
        m=skiplist->head;
        skiplist->level=level;
        skiplist->head=CreateNode(level,-1,-1);
        for(i=0;i<=(skiplist->level-1);i++)(skiplist->head)->next[i]=m->next[i];
        free(m);
    }
    p=skiplist->head;
    for(i=skiplist->level;i>=0;i--)
    {
        q=p->next[i];
        while(q!=NULL&&(q->key)<key)
        {
            p=q;
            q=p->next[i];
        }
        update[i]=p;
    }
    if(q!=NULL&&q->key==key)
        flag = 1;
    if(!flag)
    {
        q=CreateNode(level,key,value);
        for(i=level;i>=0;i--)
        {
            q->next[i]=update[i]->next[i];
            update[i]->next[i]=q;
        }
    }
    else
        printf("结点重复,请重新输入!\n");
}
void PrintList(List *skiplist)
{
    printf("\n");
    int i=0;
    Node *p;
    for(i=skiplist->level;i>=0;i--)
    {
        p=skiplist->head;
        while(p!=NULL)
        {
            if(p->key!=-1)
                printf("%d ",p->key);
            p=p->next[i];
        }
        printf("\n");
    }
}
void DeleteNode(List *skiplist,int key)
{
    int i=0 , flag = 0 ;
    Node *p=skiplist->head,*update[MAX_LEN],*q=NULL;
    for(i=skiplist->level;i>=0;i--)
    {
        q=p->next[i];
        while(q!=NULL&&(q->key)<key)
        {
            p=q;
            q=p->next[i];
        }
        update[i]=p;
    }
    if((q==NULL)||(q->key!=key))
        flag=1;
    if(!flag)
    {
        for(i=skiplist->level;i>=0;i--)
        {
            if(update[i]->next[i] != NULL&&(update[i]->next[i])->key == key)
            {
                q=update[i]->next[i];
                update[i]->next[i]=q->next[i];
            }
            if((skiplist->head)->next[i]==NULL)
                skiplist->level--;
        }
        free(q);
    }
    else printf("节点不存在,请重新删除!\n");
}
int SearchNode(List *skiplist,int key)
{
    int flag=0,i=0;
    Node *p = skiplist->head,*q=NULL;
    for(i=skiplist->level;i>=0;i--)
    {
        q=p->next[i];
        while(q!=NULL&&q->key<key)
        {
            p=q;
            q=p->next[i];
        }
        if(q!=NULL&&q->key==key)
        {
            printf("查询节点的value值:%d\n",q->value);
            flag=1;
            break;
        }
    }
    if(!flag)
        printf("查找失败,不存在该节点!\n");
}
int main()
{
    int key = 0 , value = 0 , ch = 0;
    List *newlist;
    newlist=Create();
    while(1)
    {
        Menu();
        scanf("%d",&ch);
        if(ch==5)
            break;
        switch(ch)
        {
            case 1:
                printf("请输入添加节点的key值,value值 (示例:3 10)(输入key值为-1结束):\n");
                while(scanf("%d %d",&key,&value))
                {
                    if(key==-1)
                        break;
                    InsertNode(newlist,key,value);
                }
                break;
            case 2:
                printf("请输入待删除节点的key值:\n");
                scanf("%d",&key);
                DeleteNode(newlist,key);
                break;
            case 3:
                printf("请输入待查询节点的key值:\n");
                scanf("%d",&key);
                SearchNode(newlist,key);
                break;
            case 4:
                printf("跳跃表如下:\n");
                PrintList(newlist);
        }
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跳跃表 的相关文章

  • 零基础入门STM32编程——点灯(HAL库)(六)

    系列教程 定时器原理与配置 系列教程 GPIO原理与配置原则 前情回顾 通过前面几篇的学习 见目录 我们对STM32的基本架构以及原理有了一定了解 对GPIO的概念了有一定的认识 接下来通过一个简单的点灯项目 进步学习STM32编程 一 项
  • 使用linux主义的问题

    第一点 看看是否有服务 没有则apt get install 第二点 更改文件后更新文件 source 文件 第三点 权限 一定要看看权限 否则上传或其他操作则不被允许

随机推荐

  • Python基础知识(第二天)

    链式赋值 系列解包覆值 常量 链式赋值 x y 123 相当于 x 123 y 123 系列解包覆值 a b c 4 5 6 相当于 a 4 b 5 c 6 常量 Python 不支持常量 即没有语法规则限制改变一个常量的值 我们只能约定常
  • 雅虎、领英接连退出中国,开发者:GitHub 也会受到影响吗?

    继半个月前微软宣布关闭领英 即 LinkedIn 在华业务后 本周二 雅虎也宣布了最新消息 自 2021 年 11 月 1 日起 用户将无法从中国大陆使用 Yahoo 的产品与服务 一时之间 许多人将这两起事件结合在一起 也由此引发了开发人
  • Windows使用C++模拟鼠标点击----防止校园网掉线--登录校园网

    Linux模拟鼠标使用shell脚本就可以实现了 可以搜一下就可以解决 Windows模拟鼠标点击使用Python总会出现问题 所以使用C 来实现 1 使用gl c include
  • 电脑商城项目总结-01用户管理模块(注册,登录,修改密码,个人信息,上传头像)

    目录 部分图片展示 application properties 创建数据库并且验证是否静态资源能够正常访问 创建用户表 实体类 持久层 业务层 控制层 拦截器 单元测试 部分图片展示 以下是大体上的代码 application prope
  • Mac平台VMware Fusion虚拟机无网络连接与解决方法

    打开设置Network 点击下方锁子打开权限后点击 新增一个 把所有能打的对勾都打上 打开虚拟机后点击上面的 lt gt 然后把对勾打到新增的那个网络设置上 然后重启 不是挂起 而是重启
  • SpringBoot修改端口号不生效

    springboot中端口失效问题 idea中除了在配置文件中配置端口 还可在Edit Configurations中配置端口号 以往在这里配置端口号都可生效 此次失效是因为 当前模块依赖的模块中resource文件未指定为资源文件 上图中
  • C++并发与异步知识点最全汇总

    c 并发 文章目录 c 并发 1 thread 2 this thread命名空间 3 互斥 1 mutex 2 符合RAII标准的锁 lock guard 3 符合RAII标准并且更自由 unique lock 4 死锁 1 死锁的预防
  • OpenGLES跨平台glReadPixels API问题解决

    1 引言 在原始Windows端上 我们使用glReadPixels 方法实现OpenGL 纹理到内存图像的转换 其中其支持的色彩类型包括GL RGBA GL RGB GL BGRA及GL BGR等色彩空间 便于我们实现纹理到各个色彩空间的
  • VLC搭建RTSP服务器的过程 -测试通过

    第一步 打开VLC 第二步 在媒体下拉菜单下 有一个子菜单 串流 如图所示 点击 串流 子菜单 弹出一个窗口 如下图所示 添加一个你要串流的本地文件 我刚才传给你的那个长一点的文件 第三步 会出现如下的界面 第五 点击下一步 第六步 在下拉
  • android 插入耳机 使用自身mic录音_苹果iPhone 12携最新系统强势登场,10款主流TWS耳机兼容性测试...

    北京时间2020年10月14日凌晨 苹果第二次秋季发布会成功落幕 会上发布了旗下搭载最新 iOS14 系统的 iPhone 12 系列智能手机和最新一代 HomePod mini 智能音箱 为了环保理念 苹果在此次发布会之后 官方商店在售
  • java时间工具类

    参考文档 https blog csdn net java mdzy article details 100099922 java时间工具类 package com td util import java sql Timestamp imp
  • python版本是3.9.3,如何匹配相应的pip或pip3?

    在 Windows 中 可以通过以下步骤来安装匹配 Python 3 9 3 版本的 pip 在浏览器中打开 https bootstrap pypa io get pip py 并下载该文件 打开命令提示符 Command Prompt
  • 多线程处理并有序整合数据方案

    方案设想 多线程异步 并行 处理待处理数据 for 线程池单例创实例和回收 防止处理过程中线程数过大 内存溢出 导致处理失败 例如持续for中new Thread 保证并行的线程处理个数 CountDownLatch 防止线程池未全部结束就
  • JS实现最美的3D宇宙特效

    好久没更新文章了 算下来大概有五个多月了吧 之前本人更新的比较频繁是因为疫情在家 不能出门 所以有充足的时间来更新文章 之后随着疫情越来越好转 本人就出去找工作了 毕竟本人的经济条件不允许本人闲着 哈哈 之后本人会更新很频繁的 很抱歉 这里
  • 计算机毕业设计之 房价数据爬虫及可视化分析

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目 房价数据爬虫及可视化分析 计算机毕业生设计 课程设计需要帮助的可以找我 2 设计概要 链 abssdf 家房价数据 二手房数据 租房数据等 21世纪是信息化时代 随着信息技术和网络
  • openstack中cinder与swift、glance的区别

    1 cinder与swift的用途是什么 cinder是块存储 用来给虚拟机挂扩展硬盘 就是将cinder创建出来的卷 挂到虚拟机里 cinder是OpenStack到F版 将之前在Nova中的部分持久性块存储功能 Nova Volume
  • vue基础知识七:SPA首屏加载速度慢的怎么解决?

    一 什么是首屏加载 首屏时间 First Contentful Paint 指的是浏览器从响应用户输入网址地址 到首屏内容渲染完成的时间 此时整个网页不一定要全部渲染完成 但需要展示当前视窗需要的内容 首屏加载可以说是用户体验中最重要的环节
  • 前端历史 --- 从HTML静态文件到前后端分离

    前端历史 从HTML静态文件到前后端分离 1 静态HTML 2 动态HTML 服务器端渲染 CGI Common Gateway Interface servlet ASP JSP PHP 服务器端渲染 SSR 3 前后端分离 客户端渲染
  • 基于LSTM神经网络的通用股票预测源代码+模型+数据集

    基于神经网络的通用股票预测模 下载地址 基于LSTM神经网络的通用股票预测源代码 模型 数据集 0 使用方法 How to use 使用getdata py下载数据 或者使用自己的数据源 将数据放在stock daily目录下 使用data
  • 跳跃表

    include