数据结构:实验七:数据查找

一、    实验目的

(1)领会各种查找算法的过程和算法设计。

(2)掌握查找算法解决实际问题。

二、  实验要求

(1)编写一个程序exp8-1.cpp, 按提示输入10个任意的整形数据(无序),再输入一个待查找的数据,采用顺序查找方法,如果查找成功,返回该数据所在的位置(逻辑序号)。 如果查找不成功,给出一定的提示。

(2)编写一个程序exp8-2.cpp,输出在顺序表(1,2,3,4,5,6,7,8,9,10)中采用折半查找方法查找关键字9的过程。

三、实验环境

Windows+DEV C++( 或者其他编译工具)

四、实验步骤及结果 

1.类型声明

(1)

顺序查找(无序):

typedef int KeyType;//定义关键字类型为int

typedef char InfoType[10];

typedef struct {

   KeyType Key;//关键字项

   InfoType data;//其他数据项,类型为InfoType

} NodeType; //查找元素类型

typedef NodeType SeqList[MAXSIZE];

(2)

折半查找(递归):

typedef int KeyType;//定义关键字类型为int

typedef char InfoType[10];

typedef struct {

   KeyType key;//关键字项

   InfoType data;//其他数据项,类型为InfoType

} NodeType; //查找元素类型

typedef NodeType SeqList[MAXL];//顺序表类型

2.各类查找算法的实现

(1)

顺序查找(无序):

int Search(SeqList R,int n,KeyType k) {

   int i=0;

   while(i<n&&R[i].Key!=k) {

       i++;

   }

   if(i>=n)

       return -1;

   else

      

   return i;

}

(2)

折半查找(递归):

int  BinSearch(SeqList R,KeyType k,int low,int high,int count)//折半查找算法(递归)

{

   int mid;

   if(low<=high)

   {

       mid=(low+high)/2;

       printf("第%d次查找:在[%d,%d]中查找到元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);

       if(R[mid].key==k)//查找成功返回

       return mid;

       else if(R[mid].key>k) //继续在R[low...mid-1]中查找

       BinSearch(R,k,low,mid-1,count);

       else

       BinSearch(R,k,mid+1,high,count);//继续在R[mid+1...high]中查找

   }

   else return -1;

}

3.主程序设计及完成实验要求中的功能

(1)

顺序查找(无序):

int main() {

   SeqList R;

   int n=10;

   KeyType k = 9;

   printf("输入序列内容(十个不同整型数字):");

   int i;

   for(i=0;i<10;i++)

   {

       scanf("%d",&R[i].Key);

   }

    printf("序列为:");

    for(i=0;i<n;i++)

    {

        printf("%d,",R[i].Key);

    }

    printf("\n请输入需要查找的数字为:");

    scanf("%d",&k);

   printf("需要搜索的数字为%d",k);

   if((i =Search(R,n,k))!=-1)

       printf("\n%d在序列的第%d位置",k,i);

   else

       printf("\n元素%d不在序列中\n",k);

   printf("\n");

}

(2)

折半查找(递归):

int main()

{

   SeqList R;

   int i;

   int n=10;

   KeyType k = 9;

   int a[]={1,2,3,4,5,6,7,8,9,10};

   for(i=0;i<n;i++)//建立顺序表

   R[i].key=a[i];

   printf("用递归方法:\n");

   if((i =BinSearch(R,k,0,9,0))!=-1)

       printf("元素%d的位置是%d\n",k,i);

   else

       printf("元素%d不在表中\n",k);

}

exp8-1:

#include <stdio.h>
#define MAXSIZE 100
typedef int KeyType;//定义关键字类型为int
typedef char InfoType[10];
typedef struct {
	KeyType Key;//关键字项
	InfoType data;//其他数据项,类型为InfoType
} NodeType; //查找元素类型
typedef NodeType SeqList[MAXSIZE];
int Search(SeqList R,int n,KeyType k) {
	int i=0;
	while(i<n&&R[i].Key!=k) {
		i++;
	}
	if(i>=n)
		return -1;
	else
		
	return i;
}
int main() {
	SeqList R;
	int n=10;
	KeyType k = 9;
	printf("输入序列内容(十个不同整型数字):");
	int i;
	for(i=0;i<10;i++)
   {
       scanf("%d",&R[i].Key);
   }
    printf("序列为:");
    for(i=0;i<n;i++)
    {
        printf("%d,",R[i].Key);
    }
    printf("\n请输入需要查找的数字为:");
    scanf("%d",&k);
   printf("需要搜索的数字为%d",k);
	if((i =Search(R,n,k))!=-1)
		printf("\n%d在序列的第%d位置",k,i);
	else
		printf("\n元素%d不在序列中\n",k);
	printf("\n");
}

exp8-2:

#include <stdio.h>
#define MAXL 100
typedef int KeyType;//定义关键字类型为int 
typedef char InfoType[10];
typedef struct {
	KeyType key;//关键字项
	InfoType data;//其他数据项,类型为InfoType
} NodeType; //查找元素类型
typedef NodeType SeqList[MAXL];//顺序表类型 
int  BinSearch(SeqList R,KeyType k,int low,int high,int count)//折半查找算法(递归)
{
	int mid; 
	if(low<=high)
	{
		mid=(low+high)/2;
		printf("第%d次查找:在[%d,%d]中查找到元素R[%d]:%d\n",++count,low,high,mid,R[mid].key);
		if(R[mid].key==k)//查找成功返回
		return mid;
		else if(R[mid].key>k) //继续在R[low...mid-1]中查找
		BinSearch(R,k,low,mid-1,count); 
		else
		BinSearch(R,k,mid+1,high,count);//继续在R[mid+1...high]中查找
	}
	else return -1;
}
int main()
{
	SeqList R;
	int i;
	int n=10;
	KeyType k = 9;
	int a[]={1,2,3,4,5,6,7,8,9,10};
	for(i=0;i<n;i++)//建立顺序表
	R[i].key=a[i];
	printf("用递归方法:\n"); 
	if((i =BinSearch(R,k,0,9,0))!=-1)
		printf("元素%d的位置是%d\n",k,i);
	else
		printf("元素%d不在表中\n",k);
}
 

4.实验结果截图

(1)

顺序查找(无序):

(2)

折半查找(递归):

如需源文件,请私信作者,无偿

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字旅游引领未来智慧之旅:科技应用深度重塑旅游生态,智慧服务全面升级打造极致高品质旅游体验

随着信息技术的飞速发展&#xff0c;数字旅游作为旅游业与科技融合的新兴业态&#xff0c;正以其独特的魅力和优势&#xff0c;引领着旅游业迈向智慧之旅的新时代。数字旅游不仅通过科技应用重塑了旅游生态&#xff0c;更通过智慧服务为游客带来了高品质的旅游体验。本文将深入…

从键入网址到网页显示,期间发生了什么?

从键入网址到网页显示&#xff0c;期间发生了什么&#xff1f; 孤单小弟【HTTP】真实地址查询【DNS】指南帮手【协议栈】可靠传输【TCP】远程定位【IP】两点传输【MAC】出口【网卡】送别者【交换机】出境大门【路由器】互相扒皮【服务器与客户端】相关问答 不少小伙伴在面试过程…

浅谈Agent AI智能体的未来

Agent AI智能体的未来非常广阔和潜力巨大。随着技术的发展和应用场景的不断拓展&#xff0c;我们可以期待以下几个方面的发展&#xff1a; 更加智能化&#xff1a;Agent AI智能体将会变得越来越智能&#xff0c;具备更强大的学习、推理和决策能力。它们可以通过大数据和机器学习…

java序列化和反序列化基础学习

一、前言 前文分析了java的反序列化的DNSURL利用链&#xff0c;但是对于java反序列化的一些过程不是很了解&#xff0c;这篇主要记录下学习java反序列基础知识 二、原理 概念 1、什么是序列化和反序列化 &#xff08;1&#xff09;Java序列化是指把Java对象转换为字节序列…

【C++】一篇文章带你深入了解stack、queue 和 priority_queue

目录 一、stack的介绍和使用1.1 stack的介绍1.2 stack的使用1.2.1.1 [stack对象的构造](https://legacy.cplusplus.com/reference/stack/stack/stack/)1.2.1.2 stack对象的容量操作1.2.1.2.1 [empty()函数](https://legacy.cplusplus.com/reference/stack/stack/empty/)1.2.1.2…

周三多《管理学原理》第3版/考研真题/章节练习题

普通高等教育“十一五”国家级规划教材《管理学原理》&#xff08;第3版&#xff0c;周三多、陈传明、龙静编著&#xff0c;南京大学出版社&#xff09;是我国高校广泛采用的管理学权威教材之一&#xff0c;也被众多高校&#xff08;包括科研机构&#xff09;指定为考研考博专业…

UDP/TCP

udp/tcp特征 udp&#xff1a; 无连接不可靠传输面向数据包全双工 tcp&#xff1a; 有连接可靠传输面向字节流全双工 解释&#xff1a; 有连接/无连接&#xff1a;发送消息时&#xff0c;对方是否必须要在线 比如我们聊天程序&#xff0c;我们给对方发送消息&#xff0c;是不管现…

C++笔试练习笔记 【2】: 数字统计 BC153 两个数组的交集 NC313 点击消除 AB5

文章目录 数字统计分析题目代码部分 两个数组的交集题目分析代码部分 点击消除题目解析代码部分 数字统计 分析题目 这个题涉及到两个知识点&#xff0c;就是枚举和数字的拆分 那么我的思路是进行遍历&#xff0c;拆分数字判断二的个数&#xff0c;枚举进行计数 那么数字的拆分…

C++协程库封装

操作系统&#xff1a;ubuntu20.04LTS 头文件&#xff1a;<ucontext.h> 什么是协程 协程可以看作轻量级线程&#xff0c;相比于线程&#xff0c;协程的调度完全由用户控制。可以理解为程序员可以暂停执行或恢复执行的函数。将每个线程看作是一个子程序&#xff0c;或者…

java同步大量数据到本地数据库方法总结

最近在做一个需求&#xff0c;就是我需要对三方接口调用的数据存放到本地的数据库里的数据表里面。那么一开始我就是直接一条一条save&#xff0c;结果发现耗时非常严重&#xff0c;后面我就进行了改进。就是分批次去同步或者分批次去异步。 现在我直接贴出我写的代码&#xf…

《MySQL对数据库中表的结构的操作》

文章目录 一、建表二、查看表结构所有能查看到数据库&#xff0c;表的操作痕迹的本质都是服务器保存下来了这些操作记录。 三、修改表1.改表名字2.添加表记录3.添加表的更多字段4.修改表的字段5. 删除表的字段 总结 以下的数据库表的操作全是基于user_db这个数据库操作的&#…

maven聚合,继承等方式

需要install安装到本地仓库&#xff0c;或者私服&#xff0c;方可使用自己封装项目 编译&#xff0c;测试&#xff0c;打包&#xff0c;安装&#xff0c;发布 parent: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…

Golang图片验证码的使用

一、背景 最近在使用到Golang进行原生开发&#xff0c;注册和登录页面都涉及到图片验证码的功能。找了下第三方库的一些实现&#xff0c;发现了这个库用得还是蛮多的。并且支持很多类型的验证方式&#xff0c;例如支持数字类型、字母类型、音频验证码、中文验证码等等。 项目地…

《MySQL是怎样运行的》读书笔记(二) 从一条记录说起-InnoDB记录结构

前言 到现在为止&#xff0c; MySQL 还是一个黑盒&#xff0c;只知道使用客户端发送请求并等待服务器返回结果 那么表中的数据到底存到了哪里?以什么格式存放的? MySQL 是以什么方式来访问的这些数据? 相应的知识储备我只知道MySQL 服务器上负责对表中数据的读取和写入工…

C语言:文件操作(下)

片头 嗨&#xff01;小伙伴们&#xff0c;在前2篇中&#xff0c;我们分别讲述了C语言&#xff1a;文件操作&#xff08;上&#xff09;和 C语言&#xff1a;文件操作&#xff08;中&#xff09;&#xff0c;今天我们将会学习文件操作&#xff08;下&#xff09;&#xff0c;准…

C语言异步编程

回调函数在异步编程中有着重要的作用&#xff0c;在接口编程应用广泛&#xff0c;实战中经常会注册一个回调函数来接收其他程序返回的数据&#xff0c;这样做的好处是调用者无需主动去获取被调用者的数据&#xff0c;仅仅需要回调&#xff0c;让被调用者去传送数据&#xff0c;…

VS code 同步odata服务

在做UI5得开发过程中&#xff0c;经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存

C++ | Leetcode C++题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; class Solution { public:string getPermutation(int n, int k) {vector<int> factorial(n);factorial[0] 1;for (int i 1; i < n; i) {factorial[i] factorial[i - 1] * i;}--k;string ans;vector<int> valid(n 1, 1);…

mysql主库delete一个没主键的表导致从库延迟很久问题处理

一 问题描述 发现线上环境一个从库出现延迟&#xff0c;延迟了2天了&#xff0c;还没追上主库。 查看当前运行的sql及事务&#xff0c;发现这个sql语句是在delete一个没主键的表。 二 问题模拟 这里在测试环境复现下这个问题。 2.1 在主库造数据 use baidd; CREATE TABL…

arthas watch怎么监控指定参数值?

watch com.codex.terry.controller.HelloWorldController getUserInJson2 "{params,returnObj}" params[0] "world" -v 要分析的代码&#xff1a; 浏览器请求http://localhost:8080/say/tt&#xff0c;arthas控制台打印的信息如下&#xff1a; 浏览器请…