第7关:基于顺序存储结构的图书信息表的最佳位置图书的查找

任务描述

本关任务:定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据来完成图书信息表的创建,然后根据指定的最佳位置的序号,查找该位置上的图书,输出相应图书的信息。

编程要求

输入

总计n+m+2行。首先输入n+1行,其中,第一行是图书数目n,后n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。其中书号和书名为字符串类型,价格为浮点数类型。然后输入m+1行,其中,第一行是一个整数m,代表查找m次,后m行每行内容为一个整数,代表待查找的图书的位置序号。

输出

输出m行 若查找成功: 输出内容为第i次查询的指定位置上的一本图书的信息(书号、书名、价格),书号、书名、价格用空格分隔,其中价格输出保留两位小数。 若查找失败: 只输出以下提示:抱歉,最佳位置上的图书不存在!

测试说明

平台会对你编写的代码进行测试:

代码

#include<iostream>
#include<iomanip>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 1000    //图书表可能达到的最大长度
using namespace std;
typedef struct
{//图书信息定义
    char no[20];    //图书ISBN
    char name[50];   //图书名字
    float price;   //图书价格
}Book;
typedef struct
{//图书表的顺序存储结构类型为SqList
    Book *elem;                   //存储空间的基地址
    int length;                   //图书表中当前图书个数
}SqList;

int FindLocate_Sq(SqList L)
{//查找最佳位置图书并输出数据
     int i,m,a[100];       //设置最多查询100本书
      cin>>m;               //查询m个位置的书
    for(i=0;i<m;i++)
        cin>>a[i];          //依次输入待查询的书的位置
    for(i=0;i<m;i++)        //依次查询m个位置的书的信息,顺序表通过下标直接定位,无需遍历
    {            
        if(a[i]<1||a[i]>L.length)    //数组下标从0开始,但统一规定位置从1开始。即位置1是a[0],位置length是a[L.length-1]
            cout<<"Sorry,the book on the best position doesn't exist!"<<endl;
        else
            cout<<L.elem[a[i]-1].no<<" "<<L.elem[a[i]-1].name<<" "<<fixed<<setprecision(2)<<L.elem[a[i]-1].price<<endl; 
    }
    return OK;

}

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 基于顺序存储结构图书信息最佳位置图书查找可以通过二分查找算法实现。具体步骤如下: 1. 将图书信息按照图书编号从小到大排序。 2. 定义查找范围的左右边界,初始值为和长减1。 3. 计算中间位置mid,即左右边界的平均值。 4. 将要查找图书编号与中间位置图书编号进行比较。 5. 如果要查找图书编号小于中间位置图书编号,则将右边界更新为mid-1。 6. 如果要查找图书编号大于中间位置图书编号,则将左边界更新为mid+1。 7. 如果要查找图书编号等于中间位置图书编号,则返回该图书位置。 8. 如果左边界大于右边界,则示要查找图书不存在于中。 通过二分查找算法,可以快速定位到要查找图书中的位置,提高了查找效率。 ### 回答2: 基于顺序存储结构图书信息最佳位置查找可以采用折半查找算法。 具体的实现步骤如下: 第一步,将目标值与中间位置键字进行比较。如果相等,则查找成功,返回键字在中的位置下标。 第二步,如果目标值小于中间位置键字,则在左半部分中继续进行查找;如果目标值大于中间位置键字,则在右半部分中继续进行查找。 第三步,重复第一步和第二步,直到找到目标值或者确定目标值不存在为止。 折半查找算法的平均查找次数为log2(n)+1,其中n为键字的个数。相比于顺序查找,折半查找算法的查找效率更高,可以更快地找到目标值。但是,需要注意的是,折半查找算法要求中的键字必须是按照升序排列的,否则算法将无法正常运行。 除了折半查找算法,还有其他的查找算法可以用来查找基于顺序存储结构图书信息最佳位置键字,如线性查找、插值查找等等。不过,由于基于顺序存储结构图书信息一般较小,采用折半查找算法已经足够快速高效了。 ### 回答3: 基于顺序存储结构图书信息通常是按照书号的大小顺序排列。如果要查找某一本书,可以采用二分查找的方法来提高查找效率。 具体操作步骤如下: 1. 确定待查找书号; 2. 初始化左右两个指针,将左指针指向的第一个位置,右指针指向的最后一个位置; 3. 取中间位置的指针,如果待查找书号与中间位置书号相等,则找到该书,返回位置; 4. 如果待查找书号小于中间位置书号,则将右指针移到中间位置的左边一位,重新计算中间位置的指针; 5. 如果待查找书号大于中间位置书号,则将左指针移到中间位置的右边一位,重新计算中间位置的指针; 6. 反复进行3-5步,直到找到该书或左右指针重合(即未找到该书)。 采用二分查找方法可以有效地提高查找效率,但是也有一些注意点需要考虑: 1. 该方法适用于中记录较多且按书号有序排列的情况,如果中记录较少,则遍历整个的效率更高; 2. 如果中记录的书号并非完全有序,而是偏移一定范围内的可能会出现查找错误的情况,需要在实现中对此进行补充和检测; 3. 如果插入和删除操作频繁,需要对重新排序或采取其他的数据结构实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值