数据结构实验---查找

实验内容:

对给定的序列分别采用顺序查找、折半查找算法,查找某个数,若查找成功,输出该数在序列中的序号;若查找不成功,输出提示信息。不管是否查找成功,均要输出查找过程中每次比较的元素。

  1. Search_A.cpp文件
    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include <iostream>
    #include "Search_A.h"
    
    using namespace std;
    
    //在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
    int Search_Seq(SSTable& ST, KeyType key)			//顺序查找
    {
    	for (int i = 0; i < ST.length; i ++)
    	{
    		ST.R[i].otherinfo = ST.R[i].key;			//将比较的值存入otherinfo
    		if (ST.R[i].key == key)		return i + 1;	//从后往前查找
    	}
    	return 0;
    }
    
    //在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
    int Search_Bin(SSTable& ST, KeyType key)			//折半查找
    {
    	int low = 1;
    	int mid;
    	int high = ST.length;							//置查找区间初值
    	int i = 0;
    	while (low <= high)
    	{
    		mid = (low + high) / 2;
    		ST.R[i].otherinfo = ST.R[mid].key;			//将比较的值存入otherinfo
    		i += 1;
    		if (key == ST.R[mid].key)		return mid + 1;		//找到待查元素
    		else if (key < ST.R[mid].key)	high = mid - 1;		//继续在前一子表进行查找
    		else							low = mid + 1;		//继续在后一子表进行查找
    	}
    	return 0;										//表中不存在待查元素
    }
    

  2. Search_A.h文件
    #pragma once
    
    #ifndef Search_A_H
    #define Search_A_H
    
    #define KeyType int		//宏定义特殊的返回类型为int
    #define InfoType int
    
    typedef struct {
    	KeyType key;		//关键字域
    	InfoType otherinfo;	//其他域
    }ElemType;
    
    typedef struct {
    	ElemType R[20];		//存储空间基地址
    	int length;			//当前长度
    }SSTable;
    
    int Search_Seq(SSTable& ST, KeyType key);		//顺序查找
    int Search_Bin(SSTable& ST, KeyType key);		//折半查找
    
    #endif
    

  3. main.cpp文件
    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include <iostream>
    #include "Search_A.h"
    
    using namespace std;
    
    int main()
    {
    	SSTable ST;
    
    	int key, m = 0;
    
    	cout << "输入序列长度:";
    	cin >> ST.length;						//先输入该序列的长度
    	for (int i = 0; i <= ST.length; i++)	//初始化ST里的值
    	{
    		ST.R[i].key = 0;
    		ST.R[i].otherinfo = 0;
    	}	
    	cout << "输入序列元素:";
    	for (int i = 0; i < ST.length; i++)
    		cin >> ST.R[i].key;					//输入序列元素	
    
    	cout << "输入要查找的元素:";
    	cin >> key;								//输入要查找的元素
    
    	if (!Search_Seq(ST, key))
    		cout << "顺序查找-查无该元素。" << endl << endl;
    	else
    		cout << "顺序查找-查找成功,该元素在序列中的序号为" << Search_Seq(ST, key) << endl << endl;
    
    	cout << "顺序查找-每次比较的元素:";
    	while (ST.R[m].otherinfo)
    	{
    		cout << ST.R[m].otherinfo << "\t";	//依次输出比较的值
    		m += 1;
    	}
    	cout << endl << endl;
    	
    	for (int i = 0; i <= ST.length; i++)	//重置ST里依次比较的值
    	{
    		ST.R[i].otherinfo = 0;
    	}
    
    	if (!Search_Bin(ST, key))
    		cout << "折半查找-查无该元素。" << endl << endl;			//输出位置
    	else
    		cout << "折半查找-查找成功,该元素在序列中的序号为" << Search_Bin(ST, key) << endl << endl;			//输出位置	
    
    	cout << "折半查找-每次比较的元素:";
    	m = 0;
    	while (ST.R[m].otherinfo)
    	{
    		cout << ST.R[m].otherinfo << "\t";	//依次输出比较的值
    		m += 1;
    	}
    
    	cout << endl << endl;
    	return 0;
    }
    

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢慢丶丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值