educoder头歌数据结构 查找 第1关:实现折半查找

news2024/10/5 13:47:52

                                                          本文已收录于专栏

                 🌲《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》🌲

任务描述

本关要求通过补全函数BSL_FindKey来实现在已排序的顺序表中查找关键码值为key的结点并返回该结点的编号。

相关知识

折半查找通常是针对顺序存储的线性表,线性表的结点按关键码从小到大排序,后面称之为折半查找的顺序表。为了简化讨论,假设折半查找的顺序表中每个结点只含一个关键码,关键码为整数。图 1 给出了一个存储了 4 个关键码的折半查找的顺序表的存储结构图。

下面描述了线性表顺序存储的一种实现方案。该实现方案的示意图为:

指针pkey是存储关键码的连续空间的起始地址,顺序表中当前的关键码的个数由len给出,该顺序表中最多可存储max个关键码。

pkeylenmax组织成一个结构,该结构定义为:

 
  1. struct BSeqList{
  2. int* pkey; // 指向关键码数组的指针
  3. int len; // 当前元素个数
  4. int max; // 线性表的最大元素数
  5. };

只要给定指向该结构的一指针blist,就可对线性表进行操作。

对折半查找的顺序表定义如下操作,各个操作函数的功能详见下面给出的代码文件 BSlist.cpp 的代码框架:

 
  1. BSeqList* BSL_Create(int size);
  2. void BSL_Free(BSeqList* blist);
  3. int BSL_InsKey(BSeqList* blist, int key);
  4. int BSL_FindKey(BSeqList* blist, int key);
  5. int BSL_DelKey(BSeqList* blist, int key);
  6. void BSL_Print(BSeqList* blist);

编程要求

本关的编程任务是补全 step1/BSlist.cpp 文件中的BSL_FindKey函数,以实现在已排序的顺序表中查找关键码值为key的结点并返回该结点的编号。当返回值大于等于 0 时则表示找到值为key的结点的编号,若为 -1 则表示没有找到。

  • 具体请参见后续测试样例。

本关涉及的代码文件 BSlist.cpp 的代码框架如下:

 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "bsList.h"
  4. BSeqList* BSL_Create(int size)
  5. //创建一个顺序表
  6. //与BSL_Free()配对
  7. {
  8. BSeqList* blist=(BSeqList*)malloc(sizeof(BSeqList));
  9. blist->pkey = (int*)malloc(sizeof(int)*size);
  10. blist->max=size;
  11. blist->len=0;
  12. return blist;
  13. }
  14. void BSL_Free(BSeqList* blist)
  15. //释放/删除顺序表
  16. //与BSL_Create()配对
  17. {
  18. free(blist->pkey);
  19. free(blist);
  20. }
  21. int BSL_FindKey(BSeqList* blist, int key)
  22. //在排序的顺序表中查找关键码值为key的结点,返回结点的编号
  23. //返回值大于等于0时表示找到值为key的结点的编号,-1表示没有找到
  24. {
  25. // 请在此添加代码,补全函数BSL_FindKey
  26. /********** Begin *********/
  27. /********** End **********/
  28. }
  29. int BSL_InsKey(BSeqList* blist, int key)
  30. //在排序的顺序表中插入一个值为key的结点
  31. //返回值大于等于0表示插入的位置, -1表示表满(无法插入)
  32. {
  33. if (blist->len>=blist->max) return -1;
  34. int k, r, m;
  35. k=0; r=blist->len-1;
  36. //寻找插入位置
  37. while (k<=r) {
  38. m=(k+r)>>1; //m=(k+r)/2
  39. if (key == blist->pkey[m]) return -2;若不允许插入已存在的值,则需要此行
  40. if (key<blist->pkey[m]) r=m-1;
  41. else k=m+1;
  42. }
  43. //插入位置为k, 腾出k号位置
  44. for (r=blist->len; r>k; r--)
  45. blist->pkey[r]=blist->pkey[r-1];
  46. //key放入k号位置
  47. blist->pkey[k]=key;
  48. blist->len++;
  49. return k;
  50. }
  51. int BSL_DelKey(BSeqList* blist, int key)
  52. //在排序的顺序表中删除值为key的结点,
  53. //存在值为x的结点则返回结点编号, 未找到返回-1
  54. {
  55. int k=BSL_FindKey(blist, key);
  56. if (k<0) return -1;
  57. int i=k;
  58. while(i < blist->len-1) {
  59. blist->pkey[i] = blist->pkey[i+1];
  60. i++;
  61. }
  62. blist->len --;
  63. return k;
  64. }
  65. void BSL_Print(BSeqList* blist)
  66. //打印整个顺序表
  67. {
  68. if (blist->len==0) {
  69. printf("The list is empty.\n");
  70. return;
  71. }
  72. printf("The list contains: ");
  73. for (int i=0; i<blist->len; i++) {
  74. printf("%d ", blist->pkey[i]);
  75. }
  76. printf("\n");
  77. }

测试说明

本关的测试文件是 step1/Main.cpp ,测试过程如下:

  1. 平台编译 step1/Main.cpp ,然后链接相关程序库并生成 exe 可执行文件;

  2. 平台运行该 exe 可执行文件,并以标准输入方式提供测试输入;

  3. 平台获取该 exe 可执行文件的输出,然后将其与预期输出对比,如果一致则测试通过;否则测试失败。

输入输出格式说明

输入格式: 首先输入一个正整数max,创建一个最多可存储max个元素的表。 然后输入多个操作:如果输入 “insert” ,则后面跟一个数x,表示将x插入;如果输入 “delete” ,则后面跟一个数x,表示将x删除;如果输入 “end” ,表示输入结束。

输出格式: 输出表的长度,然后从表头到表尾依次输出各元素。

以下是平台对 step1/Main.cpp 的样例测试集:

样例输入: 9 insert 9 insert 8 insert 89 insert 11 insert 22 insert 13 delete 11 delete 5 end

样例输出: list length: 5 The list contains: 8 9 13 22 89


开始你的任务吧,祝你成功!

AC_Code

//折半查找的顺序表 实现文件
//每个结点的数据是关键码
//
#include <stdio.h>
#include <stdlib.h>
#include "BSlist.h"
 
BSeqList* BSL_Create(int size)
//创建一个顺序表
//与BSL_Free()配对
{
    BSeqList* blist=(BSeqList*)malloc(sizeof(BSeqList));
    blist->pkey = (int*)malloc(sizeof(int)*size);
    blist->max=size;
    blist->len=0;
    return blist;
}
 
void BSL_Free(BSeqList* blist)
//释放/删除顺序表
//与BSL_Create()配对
{
    free(blist->pkey);
    free(blist);
}
 
int BSL_FindKey(BSeqList* blist, int key)
//在排序的顺序表中查找关键码值为key的结点,返回结点的编号
//返回值大于等于0时表示找到值为key的结点的编号,-1表示没有找到
{
    /*请在BEGIN和END之间实现你的代码*/
    /*****BEGIN*****/
    int k,r,m;//k是low,r是high,m是mid
    k=0;
    r=blist->len-1;
    while(k<=r)
    {
        m=(k+r)/2;
        if(key==blist->pkey[m])
        {
            return m;
        }
        else
        {
            if(key<blist->pkey[m])
            {
                r=m-1;
            }
            else
            {
                k=m+1;
            }
        }
    }
    return -1;
    /******END******/
    /*请不要修改[BEGIN,END]区域外的代码*/
}
 
int BSL_InsKey(BSeqList* blist, int key)
//在排序的顺序表中插入一个值为key的结点
//返回值大于等于0时表示插入的位置, -1表示表满(无法插入)
{
 
    if (blist->len>=blist->max) return -1;
 
    int k, r, m;
    k=0; r=blist->len-1;
 
    //寻找插入位置
    while (k<=r) {
        m=(k+r)>>1; //m=(k+r)/2
        if (key == blist->pkey[m]) return -2;若不允许插入已存在的值,则需要此行
        if (key<blist->pkey[m])  r=m-1;
        else k=m+1;
    }
 
    //插入位置为k, 腾出k号位置
    for (r=blist->len; r>k; r--) 
        blist->pkey[r]=blist->pkey[r-1];
    //key放入k号位置
    blist->pkey[k]=key;
    blist->len++;
    return k;
}
 
int BSL_DelKey(BSeqList* blist, int key)
//在排序的顺序表中删除值为key的结点, 
//存在值为x的结点则返回结点编号, 未找到返回-1
{
    int k=BSL_FindKey(blist, key);
    if (k<0) return -1;
    int i=k;
    while(i < blist->len-1) {
        blist->pkey[i] = blist->pkey[i+1];
        i++;
    }
    blist->len --;
    return k;
}
 
void BSL_Print(BSeqList* blist)
//打印整个顺序表
{
    if (blist->len==0) {
        printf("The list is empty.\n");
        return;
    }
    printf("The list contains: ");
    for (int i=0; i<blist->len; i++) {
        printf("%d  ", blist->pkey[i]);
    }
    printf("\n");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SWOT分析

什么是SWOT分析?从做法到具体事例、注意点进行解说 SWOT分析法是将本公司的内部环境和外部环境作为强项(Strength)、弱点(Weakness)、机会(Opportunity)、威胁(Threat)进行梳理和分析的手法。以及把握事业现状的框架。从SWOT分析的方法到具体事例、注意事项&#xff0c;以图解…

砥砺前行,匠心致远|袋鼠云联合创始人、易知微CEO宁海元荣获“数字工匠 ”

近期&#xff0c;在余杭区数管局召开的“学习贯彻二十大&#xff0c;聚力建设新中心”联合主题党日活动暨余杭数改企业联盟党建联建共建机制圆桌恳谈会上&#xff0c;袋鼠云联合创始人、易知微CEO宁海元荣获2022年度“余杭数字工匠”&#xff0c;区数管局党组书记、局长周汝琴为…

【谷粒商城基础篇】商品服务开发:品牌管理

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念&#xff08;第一、二章&#xff09;基础环境搭建&#xff08;第三章&#xff09;整合SpringCloud整合SpringCloud、SpringCloud alibaba&#xff08;第四、五章&#xff09;前端知…

Linux进程间通信---->共享内存

文章目录什么是共享内存共享内存基本原理和共享内存有关的系统接口ftokshmgetipc相关命令查看相关共享内存信息删除相关共享内存信息shmat/shmdtshmctlipc系列设计思想总结什么是共享内存 前面我们学习了管进程间通信的一种方式—>管道。 而我们今天将要介绍的共享内存也是…

10天,几万字,源码深度解析之 Spring IOC

历时 10 天&#xff0c;终于把 Sping 源码系列写完了&#xff0c;该系列一共 5 篇&#xff0c;后续会整理成 PDF 教程&#xff0c;本文是最后一篇。 这篇文章主要讲解 IOC 容器的创建过程&#xff0c;让你对整体有一个全局的认识&#xff0c;文章没有复杂嵌套的 debug 流程&am…

SA实战 ·《SpringCloud Alibaba实战》第06章-快速搭建三大微服务并完成交互开发与测试

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 大家好,我是冰河~~ 在《SpringCloud Alibaba实战》专栏中前面的文章,我们为开发用户微服务、商品微服务和订单微服务做了充分的准备。今天…

微服务 SpringBoot 整合 Redis GEO 实现附近商户功能

文章目录⛄引言♨️广播站一、Redis GEO 数据结构用法⛅GEO基本语法、指令⚡使用GEO存储经纬度、查询距离二、SpringBoot 整合Redis 导入 店铺数据 到GEO三、SpringBoot 整合 Redis 实现 附近商户功能☁️需求介绍⚡核心源码✅附近商户效果图⛵小结⛄引言 本文参考黑马 点评项…

Spring之xml方式整合第三方框架

目录 一&#xff1a;概述 二&#xff1a;代码演示 二&#xff1a;Spring整合MyBatis的原理剖析 三&#xff1a;案例演示 一&#xff1a;概述 xml整合第三方框架有两种整合方案&#xff1a; 不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如&…

VScode连接本地Docker

一、安装VScode和Docker 1、vscode的安装 官网下载到最新的X64安装包&#xff0c;然后使用下述命令进行安装&#xff1a; dpkg -i code_1.73.1-1667967334_amd64.deb 安装成功之后&#xff0c;可以在应用的安装列表中查看到。 2、docker的安装 同上 二、创建docker的用户…

使用nginx临时搭建rtmp服务器

使用nginx临时搭建rtmp服务器 文章目录使用nginx临时搭建rtmp服务器系统环境搭建步骤RTMP服务验证由于需要研究rtmp协议交互方式及报数据格式&#xff0c;使用nginx临时搭建一个rtmp服务器&#xff0c;主要通过nginx的rtmp扩展模块实现接收RTMP推送的音视频流&#xff0c;同时提…

【C++】缺省参数

其实在C基础一文中已经介绍过了缺省参数&#xff0c;但是每次用这玩意都是很迷&#xff0c;今天趁着复习c知识&#xff0c;再来总结一下缺省参数。 &#x1f308;1.缺省参数知识图&#xff1a; 看来看去也就这么多的知识点&#xff0c;接下来就一一介绍一下&#xff1a; &…

prometheus监控微服务端口和主机存活

简介&#xff1a; BlackBox Exporter 顾名思义就是在应用程序的外部对其进行探测&#xff0c; 支持 HTTP、HTTPS、DNS、TCP、ICMP等方式对目标进行检测。 官方下载链接 https://github.com/prometheus/blackbox_exporter/releases/download/v0.21.1/blackbox_exporter-0.21.…

CRM管理系统软件哪家好?

规模不大的企业&#xff0c;往往抗风险能力较差、资金不足、员工也相对比较少&#xff0c;此时&#xff0c;客户资源&#xff0c;客户开发往往成为企业生存的基础。 对于企业&#xff0c;一款合适的CRM客户管理系统&#xff0c;绝对是小规模企业的必备工具&#xff0c;可以帮助…

自除数判断,除自身以外数组乘积,[ ]操作符,二维数组内存存储计算,有关进制转换与取数字每一位的问题

tips 1. 表达式求值的时候&#xff0c;首先当然是从左往右看&#xff0c;确定优先级&#xff08;只针对相邻操作符才有意义&#xff09;&#xff0c;相邻操作符按照优先级高低计算&#xff0c;如果&#xff08;相邻&#xff09;操作符的优先级相同&#xff08;也就是两个操作符…

4G低功耗摄像头模组如何快速唤醒拍照

对于应用在野外恶劣环境&#xff0c;无电无网络的情况下&#xff0c;需要一款能支持太阳能供电或者电池供电&#xff0c;不过前提是&#xff0c;功耗需要足够低&#xff0c;还需要能支持无线网络&#xff0c;能上传图片回到服务器&#xff0c;用于监测一些野外作业的数据&#…

Vue.set()的使用,以及对其进行深入解析

目录 Vue.set()使用 Vue.delete()的使用 Vue.set()方法原理解析 总结 Vue.set()使用 vue 在实例上添加新的属性的时候&#xff0c;该属性&#xff0c;并不是响应式的。同样删除某一属性的时候&#xff0c;也不会实时渲染到页面上。 比如&#xff1a; <p> 年龄&#x…

Python开发案例之用Python子进程关闭Excel自动化中的弹窗

利用Python进行Excel自动化操作的过程中&#xff0c;尤其是涉及VBA时&#xff0c;可能遇到消息框/弹窗&#xff08;MsgBox&#xff09;。此时需要人为响应&#xff0c;否则代码卡死直至超时 [^1] [^2]。根本的解决方法是VBA代码中不要出现类似弹窗&#xff0c;但有时我们无权修…

在专网建设场景,LoRa和NB的技术优劣对比

先说结论&#xff1a;运营商在大铺NB&#xff0c;LoRa更适用于专网。 对于某个企业或者组织的实际应用来说&#xff0c;最后很可能是nb做骨架&#xff0c;lora做补充&#xff0c;混合应用。除非是nb在覆盖继续完善做到无死角 其实&#xff0c;对于物联网复杂的应用场景来说&am…

国产的内网穿透工具也很优秀,这10款工具推荐正在寻找的你!

什么是内网穿透&#xff1f; 首先&#xff0c;我们生活中的网络从应用上可以分为内网和外网&#xff1b; 内网就是你自己的网络环境&#xff0c;就你自己能访问&#xff0c;比如你本地测试进行的localhost&#xff1b; 外网就不言而喻了&#xff0c;你看网页&#xff0c;视频…

利用vite创建vue3工程

目录 什么是vite 优势&#xff1a; 简单理解&#xff1a; 1、创建工程 2、进入工程目录&#xff0c;安装依赖 3、启动​编辑 什么是vite 官方创建的前端构建工具 优势&#xff1a; 1开发环境中&#xff0c;无需打包操作&#xff0c;可快速冷启动 2轻量快速的热重载 3真…