数据结构实验报告五 查找

article/2025/10/4 17:39:37

一、实验目的

1、掌握查找表、动态查找表、静态查找表和平均查找长度的概念。
2、掌握线性表中顺序查找和折半查找的方法。
3、学会哈希函数的构造方法,处理冲突的机制以及哈希表的查找。

二、实验内容和要求

1.静态查找表技术

依据顺序查找算法和折半查找算法的特点,对下面的两个查找表选择一个合适的算法,设计出完整的C源程序。并完成问题:
查找表1 : { 8 ,15 ,19 ,26 ,33 ,41 ,47 ,52 ,64 ,90 } ,查找key = 41
查找表2 : {12 ,76 ,29 ,15 ,62 ,35 ,33 ,89 ,48 ,20 } ,查找key =35
查找key=41的算法:折半查找算法 比较次数:3
查找key=35的算法:顺序查找算法 比较次数:5

顺序查找算法算法实现代码
#include<bits/stdc++.h>
#define MAX_NUM 100
using namespace std;
typedef int KeyType;typedef struct
{KeyType key;
}ElemType;
typedef struct
{ElemType elem[MAX_NUM];int length;
}SSTable;
int seq_search(SSTable ST,KeyType key)
{int i;ST.elem[0].key=key;for(i=ST.length;ST.elem[i].key!=key;i--);return i;
}
int main()
{SSTable ST;KeyType tkey;int n,i;ST.length=0;printf("请输入查找表元素个数:");scanf("%d",&n);printf("\n查找表输入:\n");while(n--)scanf("%d",&ST.elem[ST.length++].key);printf("\n输入查找元素:");scanf("%d",&tkey);i=seq_search(ST,tkey);if(i==0)printf("\n未找到此元素\n");elseprintf("\n在查找表中下标为%d",ST.length+1-i);return 0;
}
折半查找算法算法实现代码
#include<bits/stdc++.h>
#define MAX_NUM 100
using namespace std;
typedef int KeyType;typedef struct
{KeyType key;
}ElemType;
typedef struct
{ElemType elem[MAX_NUM];int length;
}SSTable;
int bin_search(SSTable ST,int key)
{int low,high,mid;low=0;high=ST.length;while(low<=high){mid=(low+high)/2;if(key==ST.elem[mid].key)return mid;elseif(key<ST.elem[mid].key)high=mid-1;elselow=mid+1;}return -1;
}int main()
{SSTable ST;KeyType tkey;int n,i;ST.length=0;printf("请输入查找表元素个数:");scanf("%d",&n);printf("\n查找表输入:\n");while(n--)scanf("%d",&ST.elem[ST.length++].key);printf("\n输入查找元素:");scanf("%d",&tkey);i=bin_search(ST,tkey);if(i==-1)printf("\n未找到此元素\n");elseprintf("\n在查找表中下标为%d",i+1);return 0;}

2、哈希表的构造与查找

/* 采用开放地址法构造哈希表*/
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 25
#define P 13
#define OK 1
#define ERROR 0
#define DUPLICATE -1
#define TRUE 1
#define FALSE 0
typedef struct{  /*哈希表元素结构*/int key;  /*关键字值*/int flag; /*是否存放元素*/
}ElemType;typedef struct {ElemType data[MAXSIZE];int count;      /*元素个数*/int sizeindex;  /*当前哈希表容量*/
}HashTable;int d1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; /*线性探测序列*/
int d2[15]={0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7}; /*二次探测序列*/
void dataset(int ds[],int *len);
int InsertHash(HashTable *H,int e,int d[]);
int CreateHash(HashTable *H,int ds[],int len,int d[]);
int SearchHash(HashTable *H, int e,int d[]);
void menu();
/*输入查找表*/
void dataset(int ds[],int *len){int n,m;n=0;printf("\n查找表输入:");while(scanf("%d",&m)==1){  /*以输入一个非整数作为结束*/ds[n]=m;n++;}*len=n;
}
/*计算哈希地址,插入哈希表*/
int InsertHash(HashTable *H,int e,int d[]){int k,i=1;k=e%P;while(H->data[k].flag==TRUE||k<0){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)return ERROR;}H->data[k].key=e;H->data[k].flag=TRUE;H->count++;return OK;
}
/*构造哈希表*/
int CreateHash(HashTable *H,int ds[],int len,int d[]){int i;for(i=0;i<len;i++){if(SearchHash(H,ds[i],d)!=-1)return DUPLICATE;InsertHash(H,ds[i],d);if(H->count>=MAXSIZE)return ERROR;}return OK;
}
/*初始化哈希表*/
void InitHash(HashTable *H){int i;for(i=0;i<MAXSIZE;i++){H->data[i].key=0;H->data[i].flag=FALSE;}
}
/*在哈希表中查找*/
int SearchHash(HashTable *H, int e,int d[]){int k,i=1;k=e%P;while(H->data[k].key!=e){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)return -1;}return k;
}
/*演示菜单*/
void menu(){int choice;int *p;HashTable h;h.count=0;h.sizeindex=MAXSIZE;int a[MAXSIZE]={0};int i,n,e;dataset(a,&n);  /*建立查找表*/getchar();printf("\n");do{printf("\n----哈希查找演示----\n");printf("\n1.线性探测构造哈希表\n");printf("\n2.二分探测构造哈希表\n");printf("\n3.退出\n");printf("\n输入选择:");scanf("%d",&choice);if(choice==1)p=d1;else if(choice==2)p=d2;elsereturn;InitHash(&h);   /*初始化哈希表*/if(!(i=CreateHash(&h,a,n,p))) /*构造哈希表*/printf("\n哈希表构造失败!\n");else if(i==DUPLICATE)printf("\n哈希表具有重复关键字!\n");else{printf("\n哈希表:\n");for(i=0;i<h.sizeindex;i++)printf("%3d",h.data[i].key);printf("\n\n哈希查找\n输入要查找的key值:");getchar();scanf("%d",&e);if((i=SearchHash(&h,e,p))==-1)printf("\n%d未找到\n",e);elseprintf("\n%d在哈希表中下标为%d\n",e,i);}getchar();}while(1);
}int main(){menu();return 0;
}

输入查找表为:19 14 23 1 68 20 84 27 55 11 10 79(注意以输入一个非整数结束)。
运行结果:
1)线性探测散列:
int d1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
哈希表形态:
实验五(1)

84在哈希表中的位置:8
2)二次探测散列:
int d2[15]={0,1,-1,22,-22,33,-33,44,-44,55,-55,66,-66,77,-77};
哈希表形态:
实验五(2)
84在哈希表中的位置:5


http://chatgpt.dhexx.cn/article/Ij54F2qN.shtml

相关文章

数据结构实验公交车系统

数据结构实验公交车系统&#xff08;完整代码私信&#xff09; 1.查询公交车信息 2.查询站点信息 3.查询两个站点之间的路线&#xff08;最多一次换乘&#xff09; 4.添加、删除、修改公交车&#xff0c;站点&#xff0c;路线 创建4个文本文档&#xff08;即txt&#xff09; r…

数据结构实验报告六 排序

一、实验目的 1、掌握内部排序的基本算法&#xff1b; 2、分析比较内部排序算法的效率。 二、实验内容和要求 1.运行下面程序&#xff1a; #include <stdlib.h> #include <stdio.h> #define MAX 50 int slist[MAX]; /*待排序序列*/void insertSort(int list[],…

数据结构实验——哈夫曼编码

目录 问题描述 基本要求 问题分析 实验代码 运行结果 实验总结 问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率&#xff0c;缩短信息传输时间&#xff0c;降低传输成本。但是&#xff0c;这要求在发送端通过一个编码系统对待传数据预先编码&#xff0c;在接收端…

数据结构实验C语言实现版

目录 数据结构实验——顺序表的基本操作 数据结构实验——单链表的基本操作 数据结构实验——顺序栈的建立及基本操作实现 数据结构实验——链队列的建立及基本操作实现 数据结构实验——赫夫曼树构造及赫夫曼编码的实现 数据结构实验——迪杰斯特拉算法求最短路径 数据结…

数据结构实验报告

数据结构与算法实验一&#xff08;顺序表的操作&#xff09; 一、实验目的 1&#xff0e;掌握线性表的顺序存储结构的表示和实现方法。 2&#xff0e;掌握顺序表基本操作的算法实现。 3&#xff0e;了解顺序表的应用。 二、实验内容 1&#xff0e;建立顺序表。 2&#xff0…

【数据结构】实验项目:顺序表,也就那么回事

目录 序 嗨&#xff0c;这里是狐狸~~ 简介 顺序表的结构定义&#xff1a; 声明顺序表类型变量&#xff1a; 实验内容&#xff1a; 实验说明 : 实验思路 1、 输入一组整型元素序列&#xff08;不少于10个&#xff09;&#xff0c;建立顺序表。 2&#xff0e; 在该顺…

数据结构(实验一)

第一次写报告&#xff0c;虽然有点简单&#xff0c;但还是要勉励自己再接再厉。加油 继续努力。 1.实验目的&#xff08;结出本次实验所涉及并要求掌握的知识点&#xff09; 1.掌握顺序表的存储结构形式及描述方法和基本运算的实现&#xff1b; 2.掌握用顺序表设计合理的数据…

数据结构实验

1.有序数组的插入 代码&#xff1a; bool Insert( List L, ElementType X ){//溢出if(L->LastMAXSIZE-1) return false;//插入在最后一位if(L->Data[L->Last] > X){L->Data[L->Last1]X;L->Last;return true;}int tp0;int find0;int tmp0;for(int i0;i &l…

网络传输大文件使用什么软件可以高速传输?

网络传输大文件使用什么软件可以高速传输&#xff1f;通过网络传输文件总是在速度上得不到很好的体现&#xff0c;更不用说是传输大文件了。本身支持大文件网络传输的工具就是不是很多&#xff0c;很多的传输工具对文件的大小都有所限制&#xff0c;要是想要找到一个高速传输大…

.mmap文件用什么软件可以打开?

1.下载MindManager专属打开它的软件 2。

什么是Saas软件?

人们常常会提及Saas&#xff08;萨斯&#xff09;软件&#xff0c;那么什么是Saas软件呢&#xff1f;首先大家通过百度可以看到百度百科的解释 相信大多数的伙伴们看了之后的感想就是一脸蒙圈&#xff0c;如果让自己给别人介绍什么是Saas软件还是记不住解释不清楚&#xff0c;那…

测试移动信号频率的软件,手机信号工作频段侦测软件

手机信号来源于基站发射的信号。但是常常会遇见的手机信号差&#xff0c;信号弱&#xff0c;上网速度慢等&#xff0c;都有可能是源于信号弱带来的。那么我们看见的手机上显示的信号弱&#xff0c;到底是什么信号弱&#xff1f;如何判别&#xff1f; 这里推荐一款APP软件&#…

杀毒软件可以查杀所有计算机病毒吗,杀毒软件可以查杀所有病毒吗

杀毒软件包括电脑杀毒软件和手机杀毒软件&#xff0c;那么杀毒软件可以查杀所有病毒吗&#xff1f;目前&#xff0c;做到所有病毒查杀还没有一家杀毒软件敢100%保证&#xff0c;因为电脑病毒也在日新月异的发展着&#xff0c;那是不是新病毒就查杀不了呢&#xff1f;也不是&…

可以测试电脑网络速度的软件,介绍4种有用的Internet Speed软件应用程序,用于测试网络速度软件...

当今社会将使用Internet&#xff0c;但是Internet的速度极大地影响了我们的工作和浏览. 在玩游戏和观看视频时测网速什么软件好&#xff0c;拥有一个良好的Internet甚至更为必要. 目前&#xff0c;我们可以使用Internet速度测试软件进行测试. 网络的速度和稳定性使您可以更好地…

什么软件可以测试鬼,PP助手新奇App推荐 《鬼魂探测器》能抓鬼?

最近&#xff0c;小伙伴们迷上了一款奇葩App&#xff0c;据说可以将潜伏在你周围的“阿飘”揪出来。这款软件就是《鬼魂探测器》&#xff0c;听起来是不是有点毛骨悚然&#xff0c;但又忍不住好奇心&#xff0c;通过PP助手下载一探究竟吧。 图1&#xff1a;PP助手(Win)2.0 只要…

测试电脑整机功耗软件,有什么好的测电脑整机功耗的软件吗?

很多人都说电脑的速度越快耗电量就越快&#xff0c;早期的486和现在的P4相比&#xff0c;那简直就是“节能电脑”了&#xff0c;那么想不想知道你的电脑到底有耗电量是多少呢&#xff1f;来试试Overclockulator吧&#xff0c;根据你的选择它可以估算出一台电脑的耗电量。 该软件…

有没有测试颜色的软件,用什么软件测试显示器色彩最准:色彩校正软件

用什么软件测试显示器色彩最准&#xff1a;1.iphone直接显示器校色&#xff0c;这个估计是最有效的方法。有的人可能用不惯iphone的界面&#xff0c;我经常用iphone来测试工程数据&#xff0c;因为iphone有自己的屏幕校色传感器&#xff0c;而iphone的屏幕比一般的显示器都要准…

java用什么软件_Java编程什么软件最好用?

原标题&#xff1a;Java编程什么软件最好用&#xff1f; “工欲善其事必先利其器”&#xff0c;想要学好Java编程开发&#xff0c;除了要有好的学习资源之外&#xff0c;还要有一套适合自己的Java编程软件&#xff0c;好的编程软件能极大提高你的学习和工作效率。那么&#xff…

kml用什么软件打开?

下载安装 bigemap GIS office软件&#xff08;免费就可以) 2、 安装好下载的bigemap软件&#xff0c;直接将kml kmz拖到软件里面就打开了&#xff0c;或者左上角文件打开 选择 kml/kmz 然后选择你的文件 打开记性了。 BIGEMAP支持所有文件格式的打开和保存&#xff0c;如…

可以测试英语发音的软件,检测英语发音的软件

目录 一、音标软件 ①.同求!!!和外国人多说说话。 ②.百度里打“朗酷口语”就可以了~~ 这 个软件可以的!俺也用~~~ 哈哈祝你好运~~。 ③.你好,你说的就跟复读机是一个道理。这种软件不过就是对于人的音频和关键点做了一个发音的匹配度测试,语音库会先前录好没一个单词的发…