数据结构实验7:查找的应用

目录

一、实验目的

二、实验原理

1. 顺序查找

2. 折半查找

3. 二叉树查找 

三、实验内容

实验一

任务

 代码

截图

实验2

任务

代码

截图


一、实验目的

1.掌握查找的基本概念;

2.掌握并实现以下查找算法:顺序查找、折半查找、二叉树查找。

二、实验原理

1. 顺序查找

原理:

顺序查找是一种逐个检查数据元素的搜索方法。从列表的第一个元素开始,逐个比较目标值和列表中的元素,直到找到匹配的元素或搜索完整个列表。

时间复杂度:

O(n),其中n是数据元素的数量。 

代码:

int sequential_search(int arr[], int size, int target) {for (int i = 0; i < size; i++) {if (arr[i] == target) {//若找到目标元素,返回第一个出现的索引return i;}}return -1;//若没有找到目标元素
}

2. 折半查找

原理:

折半查找要求数据元素必须有序。它通过反复将搜索范围减半来查找目标值。首先,与中间元素比较,如果目标值小于中间元素,则在左半部分继续查找;如果大于中间元素,则在右半部分继续查找。重复这个过程直到找到目标值或搜索范围缩小到空。 

时间复杂度:

 O(log n),其中n是数据元素的数量。

代码:

int binary_search(int arr[], int size, int target) {int low = 0, high = size - 1;while (low <= high) {int mid = (low + high) / 2;if (arr[mid] == target) {//若找到目标元素,返回出现的索引return mid;}else if (target < arr[mid]) {//如果中间元素较大high = mid - 1;}else {//如果中间元素较小low = mid + 1;}}return -1;//若没有找到目标元素
}

3. 二叉树查找 

原理:

二叉树是一种树形结构,每个节点最多有两个子节点,且左子节点的值小于父节点,右子节点的值大于父节点。二叉树查找利用这个有序性质,通过比较目标值和当前节点的值,决定向左子树或右子树移动,直到找到目标值或达到叶子节点。

时间复杂度:

平均情况下为O(log n),最坏情况下可能为O(n),取决于树的平衡性。

代码:

//定义二叉树结构
struct Treenode {int value;struct Treenode* left;struct Treenode* right;
};//创建新结点
struct Treenode* Create_node(int num) {struct Treenode* node = (struct Treenode*)malloc(sizeof(struct Treenode));node->value = num;node->left = NULL;node->right = NULL;return node;
}
//二叉树查找
struct Treenode* binary_tree_search(struct Treenode* root,int target) {if (root->value == target) {//如果找到return root;}else if(root->value<target){//如果目标值小于根,则在其左子树上查找return binary_tree_search(root->left, target);}else {//如果目标值大于根,则在其右子树上查找return binary_tree_search(root->right, target);}
}

三、实验内容

对同一组数据,试用三种方法查找某一相同数据:

1.建立一个顺序表,用顺序查找的方法对其实施查找;

2.建立一个有序表,用折半查找的方法对其实施查找;

3.建立一个二叉排序树,根据给定值对其实施查找;

实验一

任务

包括的函数有: typedef struct,创建函数 void create(seqlist &L),输出函数 voidprint(seqlist L),顺序查找 int find(seqlist L,intnumber),折半查找 int halffind(seqlist L,int number),主函数 main()。

 代码

#include<iostream>
using namespace std;//定义学生结构
typedef struct Record {int ID;//学号string name;//姓名string sex;//性别int age;//年龄
}student;typedef struct seqlist {student record[10];//这个列表最多有十个学生的记录int num;//实际学生的数目
};//对列表进行初始化
void Initial_list(seqlist& list) {list.num = 0;return;
}//创建列表
void create(seqlist& L) {cout << "请输入学生数目:";cin >> L.num;cout << "学号  姓名  性别  年龄" << endl;for (int i = 0; i < L.num; i++) {cin >> L.record[i].ID;cin >> L.record[i].name;cin >> L.record[i].sex;cin >> L.record[i].age;}return;
}//打印列表
void print(seqlist L) {cout << "学生的基本信息为:" << endl;cout << "学号  姓名  性别  年龄" << endl;for (int i = 0; i < L.num; i++) {cout << L.record[i].ID <<"  " <<L.record[i].name<<"  " << L.record[i].sex << "  "<<L.record[i].age << endl;}return;
}//顺序表查找
int find(seqlist L, int number) {for (int i = 0; i < L.num; i++) {if (L.record[i].ID == number) {//若找到目标元素,返回第一个出现的索引return i;}}return -1;//若目标不在顺序表中
}//折半查找
int halffind(seqlist L, int number) {int low = 0, high = L.num - 1;while (low <= high) {int mid = (low + high) / 2;if (L.record[mid].ID == number) {//若找到目标元素,返回出现的索引return mid;}else if (number < L.record[mid].ID) {//如果中间元素较大high = mid - 1;}else {//如果中间元素较小low = mid + 1;}}return -1;//若没有找到目标元素
}int main() {seqlist L1;int id1, id2,index1,index2;Initial_list(L1);//初始化create(L1);//输入,由于要求满足折半查找,则表中元素应该有序print(L1);//输出cout << "顺序查找" << endl;cout << "请输入你要查询的学号:";cin >> id1;index1 = find(L1, id1);if (index1 ==-1 ) {cout << "未找到所需元素" << endl;}else {cout << L1.record[index1].ID << "  " << L1.record[index1].name << "  " << L1.record[index1].sex << "  " << L1.record[index1].age << endl;}cout << "折半查找" << endl;cout << "请输入你要查询的学号:";cin >> id2;index2 = halffind(L1, id2);if (index2 == -1) {cout << "未找到所需元素" << endl;}else {cout << L1.record[index2].ID << "  " << L1.record[index2].name << "  " << L1.record[index2].sex << "  " << L1.record[index2].age << endl;}
}

截图

实验2

任务

 包括的函数有:结构体 typedef struct, 插入函数 void insert(bnode*& T,bnode * S), void insert1(bnode * & T) , 创 建 函 数 voidcreate(bnode*& T),查找函数:bnode *search (bnode*T. int number),主函数main()。

代码

#include <iostream>
#include <cstdlib>
using namespace std;// 定义二叉树结构
struct TreeNode {int ID;string name;string sex;int age;struct TreeNode* left;struct TreeNode* right;
};// 创建新结点
struct TreeNode* Create_node(int num) {struct TreeNode* newnode = new TreeNode;if (newnode == NULL) {cout << "内存分配失败" << endl;exit(1);  // 或者采取其他处理方式}newnode->ID = num;cout << "输入姓名、性别、年龄:" << endl;cin >> newnode->name;cin >> newnode->sex;cin >> newnode->age;newnode->left = NULL;newnode->right = NULL;return newnode;
}// 建立二叉树
struct TreeNode* buildTree() {int elem;cout << "输入节点的数值(-1代表空节点):";cin >> elem;if (elem == -1) {return NULL;}struct TreeNode* root = Create_node(elem);cout << "输入" << elem << "的左节点" << endl;root->left = buildTree();cout << "输入" << elem << "的右节点" << endl;root->right = buildTree();return root;
}// 二叉树查找
struct TreeNode* binary_tree_search(struct TreeNode* root, int target) {if (root == NULL || root->ID == target) {return root;}if (target < root->ID) {return binary_tree_search(root->left, target);}else {return binary_tree_search(root->right, target);}
}// 插入节点
void insert(struct TreeNode* root, int target) {if (root == NULL) {//若是空节点,直接插入root= Create_node(target);return;}if (target < root->ID) {//插入左子树if (root->left == NULL) {//左子树为空,直接插入root->left = Create_node(target);}else {insert(root->left, target);}}else {if (root->right == NULL) {root->right = Create_node(target);}else {insert(root->right, target);}}return;
}int main() {struct TreeNode* T = buildTree();  // 建立二叉树int number;cout << "请输入你要插入的学生的ID:";cin >> number;insert(T, 4);int targetID;cout << "输入要查找的学生ID:" << endl;cin >> targetID;struct TreeNode* ans = binary_tree_search(T, targetID);if (ans != NULL) {cout << ans->ID << " " << ans->name << " " << ans->sex << " " << ans->age << endl;}else {cout << "未找到目标节点" << endl;}return 0;
}

截图

 

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

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

相关文章

Python正则表达式Regular Expression初探

目录 Regular 匹配规则 单字符匹配 数量匹配 边界匹配 分组匹配 贪婪与懒惰 原版说明 特殊字符 转义序列 模块方法 函数说明 匹配模式 常用匹配规则 1. 匹配出所有整数 2. 匹配11位且13开头的整数 Regular Python的re模块提供了完整的正则表达式功能。正则表达式…

Win10升级Win11后卡顿了?

目录 关闭动画效果 任务栏居中改为居左 调整外观和性能 其他 当你看到最后&#xff0c;还知道哪些升级WIN11后必做的优化呢&#xff1f;欢迎在评论区分享出来&#xff01;❤️ win11上市目前也有一段时间了&#xff0c;想必很多大家都已经进行更新了。新的系统确实更加简洁…

安规电容的知识

1、常见安规电容有哪些&#xff1f; 一般我们所说的安规电容也就有两种&#xff0c;一种就是X安规电容&#xff08;X1/X2/X3安规电容&#xff09;&#xff0c;还有一种是Y电容&#xff08;最常见的是Y1和Y2安规电容&#xff09;。 2、x电容的位置 火线零线间的是X电容。x电容用…

Git将某个文件合并到指定分支

企业开发中&#xff0c;经常会单独拉分支去做自己的需求开发&#xff0c;但是某些时候一些公共的配置我们需要从主线pull&#xff0c;这时候整个分支merge显然不合适 1.切换至待合并文件的分支 git checkout <branch>2.将目标分支的单个文件合并到当前分支 git checkou…

力扣刷MySQL-第三弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

JVM中的垃圾收集算法

标记-清除算法 首先标记出所有需要回收的对象&#xff0c;在标记完成后&#xff0c;统一回收掉所有被标记的对象&#xff0c;也可以反过来&#xff0c;标记存活的对象&#xff0c;统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程 缺点 第一个是执行效率…

C# 获取QQ会话聊天信息

目录 利用UIAutomation获取QQ会话聊天信息 效果 代码 目前遇到一个问题 其他解决办法 利用UIAutomation获取QQ会话聊天信息 效果 代码 AutomationElement window AutomationElement.FromHandle(get.WindowHwnd); AutomationElement QQMsgList window.FindFirst(Tr…

4.postman批量运行及json、cvs文件运行

一、批量运行collection 1.各个接口设置信息已保存&#xff0c;在collection中点击run collection 2.编辑并运行集合 集合运行时&#xff0c;单独上传图片时报错。需修改postman设置 二、csv文件运行 可新建记事本&#xff0c;输入测试数据&#xff0c;后另存为新的文本文件&…

Pytest 结合 Allure 生成测试报告

测试报告在项目中是至关重要的角色&#xff0c;一个好的测试报告&#xff1a; 可以体现测试人员的工作量&#xff1b; 开发人员可以从测试报告中了解缺陷的情况&#xff1b; 测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率&#xff1b; 项目负责人可以通过…

echarts-wordcloud词云

echarts-wordcloud是基于echarts的一个插件&#xff0c;所以我们要首先安装echarts包&#xff0c;然后再安装echarts-wordcloud的包&#xff0c;这里我的练习项目安装的版本&#xff1b;当然&#xff0c;你可以随意安装你需要的版本&#xff1b; “echarts”: “^5.3.3”, “ec…

面试2024.1.20

简单介绍下你做的项目。 这个神领物流项目是一个前后端分离的项目&#xff0c;前段他有3个客户端&#xff08;用户端为微信小程序、司机端和快递员端为app&#xff09;一个管理端&#xff08;pc&#xff09;&#xff0c;后端用的技术栈用的是SpringAlibabaCloud、数据库用的是M…

【精选】中间件 tomcat漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

JRTP实时音视频传输(2)-使用TCP通信的案例

环境搭建等参考&#xff1a;JRTP实时音视频传输(1)-必做的环境搭建与demo测试 1.创建自己的demo 先将example1拷贝为myclienttcp.cpp和myservertcp.cpp cp example1.cpp myclienttcp.cpp cp example1.cpp myservertcp.cpp 改写jrtplib/JRTPLIB/examples/CMakeLists.txt&…

79、avx2 向量指令集优化卷积运算

上一节 介绍了 avx2 向量指令集中的 load/store 操作,本节介绍如何使用 avx2 的向量指令集来实现乘累加运算。 因为我们实战中用到的 resnet50 神经网络中,卷积运算在整个模型中的比例占据是相当高,而卷积运算的核心计算就是乘累加计算。因此,只要将最核心的乘累加计算效率…

怎么从视频中提取动图?一个方法快速提取gif

视频以连续的方式播放一系列图像帧&#xff0c;通过每秒播放的帧数&#xff08;帧率&#xff09;来创做&#xff0c;由于GIF动图则以循环播放一系列静态图像帧的方式展现动画效果。由于视频的优势在于流畅的动画、丰富的细节和长时间播放&#xff0c;因此常用于电影、电视节目、…

如何在 Ubuntu / Raspbian 上安装 MariaDB

Raspberry Pi OS&#xff08;原为Raspbian&#xff09;是为树莓派基于Debian开发的操作系统。 从2015年起&#xff0c;树莓派基金会正式将其作为树莓派的官方操作系统。 Raspbian是由Mike Thompson和Peter Green创建的一个独立项目。第一个版本于2012年6月发布&#xff0c;至…

LP-AM243x EtherNet/IP 连接施耐德 M241 EIP主站测试

硬件环境&#xff1a;LP-AM243x 开发板 施耐德 Modicon M241 软件环境&#xff1a; INDUSTRIAL-COMMUNICATIONS-SDK-AM243X MCU-PLUS-SDK-AM243X — MCU SDK for AM243x 调试过程&#xff1a; 首先&#xff0c;让AM243x能够运行 Null Boot&#xff0c; Starting NULL Boo…

Kotlin 尾递归函数

函数式编程中&#xff0c;重要的概念 尾递归。 当一个函数&#xff0c;在函数最后调用 自身&#xff0c;称为 尾递归&#xff0c;是一种特殊的递归函数。 在JVM中&#xff0c;每次方法调用时&#xff0c;都会产生新的栈帧&#xff08;stack frame&#xff09;&#xff0c;消耗栈…

TCP缓存(C++)

系统为每个 socket 创建了发送缓冲区和接收缓冲区&#xff0c;应用程序调用 send()/write()函数发送数据的 时候&#xff0c;内核把数据从应用进程拷贝 socket 的发送缓冲区中&#xff1b;应用程序调用 recv()/read()函数接收数据的时候&#xff0c;内核把数据从 socket 的接收…

C语言实现简单的扫雷游戏

目录 1 -> test.c 2 -> game.c 3 -> game.h 1 -> test.c #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu() {printf("************************************\n");printf("********* 1.play ********\n&quo…