ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:17.43KB ,
资源ID:6642331      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6642331.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验八查找.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验八查找.docx

1、实验八查找实验八 查找【实验目的】1、掌握查找表、动态查找表、静态查找表和平均查找长度的概念。2、掌握线性表中顺序查找和折半查找的方法。3、学会哈希函数的构造方法,处理冲突的机制以及哈希表的查找。4、掌握二叉排序树的构造方法和查找过程;【实验学时】2学时【实验预习】回答以下问题:1、顺序查找。顺序查找的平均查找长度和查找不成功时的比较次数。2、折半查找。折半查找的平均查找长度。3、二叉排序树和平衡二叉树。4、哈希表和哈希查找5、处理冲突的方法有哪几种?【实验内容和要求】1、编写程序exp8_1.c,实现顺序查找和折半查找。补充完整程序,调试运行测试数据:(1)顺序查找表 8 ,15 ,19 ,

2、26 ,33 ,41 ,47 ,52 ,64 ,90 查找key = 41 查找成功比较次数:_查找key = 100 查找不成功比较次数:_(2)折半查找表 12 ,15 ,20,29 ,33 ,33,48 ,65 ,89 查找key = 29 查找成功比较次数:_查找key = 99 查找不成功比较次数:_exp8_1.c参考程序如下:#include#define MAX 100#define KeyType int/*静态查找表的顺序存储结构*/typedef struct KeyType key; /*关键字值项*/ table;int inputSeqData(table R);

3、/*创建顺序查找表*/int SeqSearch (table R, int n, KeyType k ); /*顺序查找算法*/int inputBinData(table R); /*创建折半查找表,按照增序*/int BinSearch(table R,int n, KeyType k); /*折半查找算法*/int main() table RMAX; int select,n,i; KeyType k; do printf(n*MENU*n); printf( 1. 输入顺序查找表n); printf( 2. 顺序查找n); printf( 3. 输入折半查找表n); printf(

4、 4. 折半查找n); printf( 0. EXIT); printf(n*MENU*n); printf(ninput choice:); scanf(%d,&select); getchar(); switch(select) case 1: printf(n1-输入顺序查找表n); n=inputSeqData(R); printf(n顺序查找表元素:); for(i=0; in; i+) printf(%d ,Ri.key); printf(n); getchar(); break; case 2: printf(n2-顺序查找n); printf(n输入查找关键字:); scanf

5、(%d,&k); i=SeqSearch(R,n,k); if(i=-1) printf(n未找到key=%d!n,k); else printf(n查找成功!k=%d位置序号:%dn,k,i); getchar(); break; case 3: printf(n3-输入折半查找表n); n=inputBinData(R); printf(n折半查找表元素:); for(i=0; in; i+) printf(%d ,Ri.key); printf(n); getchar(); break; case 4: printf(n4-折半查找n); printf(n输入查找关键字:); scanf

6、(%d,&k); i=BinSearch(R,n,k); if(i=-1) printf(n未找到key=%d!n,k); else printf(n查找成功!k=%d位置序号:%dn,k,i); getchar(); break; case 0: break; default: break; while(select); return 0;/*创建顺序查找表*/int inputSeqData(table R) int i; KeyType a; printf(n输入顺序查找表元素(以非数值为输入结束):); i=0; while(scanf(%d,&a)=1) Ri.key=a; i+;

7、return i; /*返回顺序查找表长度*/*inputSeqData*/*(1)-顺序查找算法,返回查找到位置序号,否则返回-1*/int SeqSearch (table R, int n, KeyType k ) /*SeqSearch*/*创建折半查找表,按照增序*/int inputBinData(table R) int i,j,t; KeyType a; printf(n输入折半查找表元素(以非数值为输入结束):); t=0; while(scanf(%d,&a)=1) for(i=0; it; i+) /*找插入位置i*/ if(a=i; j-) Rj+1.key=Rj.ke

8、y;/*移动位置*/ Ri.key=a; t+; return t; /*返回折半查找表长度*/*inputBinData*/*(2)-折半查找算法,返回查找到位置序号,否则返回-1*/int BinSearch(table R,int n, KeyType k) /*BinSearch*/2、编写程序exp8_2.c,实现哈希表的创建和查找以及哈希冲突的检测方法。补充完整程序,调试运行测试数据,设关键字序列为16 74 60 43 54 90 46 31 29 88 77 e:(1)采用线性探测法,写出构造的哈希表:(2)采用二次探测法,写出构造的哈希表:(3)线性探测法哈希查找key值为7

9、4,查找成功探查_次。 线性探测法哈希查找key值为100,查找不成功探查_次。(4)二次探测法哈希查找key值为29,查找成功探查_次。 线性探测法哈希查找key值为2,查找不成功探查_次。exp8_2.c程序代码参考如下:/* 采用开放地址法构造哈希表*/#include#include#define MAXSIZE 25 /*哈希表分配存储空间大小*/#define MAX 17 /*冲突上限*/#define NULLKEY 0 /* NULLKEY为空结点标记 */#define KeyType int /*哈希表元素类型*/#define P 13 /*哈希函数采用除留取余,P因子

10、大小*/#define OK 1 /*成功标识*/#define ERROR 0 /*失败标识*/#define DUPLICATE -1 /*关键字重复标识*/*哈希表结点存储结构*/typedef struct KeyType key; HashNode;/*哈希表存储结构*/typedef struct HashNode dataMAXSIZE; int count; /*当前表中元素个数*/ int sizeindex; /*当前哈希表容量*/ HashTable;int d1MAX= 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14; /*线性探测序列*/int

11、d2MAX= 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; /*二次探测序列*/int InsertHash(HashTable *H,int e,int d); /*计算哈希地址,插入哈希表*/int CreateHash(HashTable *H,int d); /*构造哈希表*/int SearchHash(HashTable *H, int e,int d); /*哈希查找*/void InitHash(HashTable *H); /*初始化哈希表*/void menu();/*初始化哈希表*/void I

12、nitHash(HashTable *H) int i; for(i=0; idatai.key=NULLKEY; /*设置当前位置为空闲*/ H-count=0; H-sizeindex=MAXSIZE;/*InitHash*/*(1)-计算哈希地址,插入哈希表。插入成功返回成功标识否则返回失败标识*/int InsertHash(HashTable *H,int e,int d) /*InsertHash*/*构造哈希表*/int CreateHash(HashTable *H,int d) KeyType a; printf(n输入数据元素(以非数值为输入结束):); while(sca

13、nf(%d,&a)=1) if(SearchHash(H,a,d)!=-1) /*若发现有重复关键字,返回*/ return DUPLICATE; InsertHash(H,a,d); /*插入元素到哈希表*/ if(H-count=MAXSIZE) /*判断哈希表满*/ return ERROR; return OK;/*CreateHash*/*哈希查找*/int SearchHash(HashTable *H, int e,int d) /*SearchHash*/int main() HashTable h; KeyType e; int i,select,*q; do printf(

14、n*MENU*n); printf( 1. 线性探测构造哈希表n); printf( 2. 二次探测构造哈希表n); printf( 3. 线性探测哈希查找n); printf( 4. 二次探测哈希查找n); printf( 0. EXIT); printf(n*MENU*n); printf(ninput choice:); scanf(%d,&select); getchar(); switch(select) case 1: case 2: if(select=1) printf(n1-线性探测构造哈希表n); q=d1; else printf(n2-二次探测构造哈希表n); q=d2

15、; InitHash(&h); /*初始化哈希表*/ if(!(i=CreateHash(&h,q) printf(n哈希表构造失败!n); else if(i=DUPLICATE) printf(n哈希表具有重复关键字!n); else printf(n哈希表:n); for(i=0; ih.sizeindex; i+) printf(%d ,h.datai.key); printf(n); getchar(); break; case 3: case 4: if(select=3) printf(n3-线性探测哈希查找n); q=d1; else printf(n4-二次探测哈希查找n);

16、 q=d2; printf(n输入查找关键字:); scanf(%d,&e); if(i=SearchHash(&h,e,q)=-1) printf(n%d未找到n,e); else printf(n%d在哈希表中下标为%dn,e,i); getchar(); break; case 0: break; default: break; while(select); return 0;【拓展实验】3、已知一个个数为12的数据元素序列为Dec,Feb,Oct,June,Sept,Aug,Apr,May,July,Jan,Mar,要求编写程序:(1)按各个数据元素的顺序(字母大小顺序)构造一棵二叉排序树,并按顺序打印排序结果。(2)查找数据Sdept是否存在。【实验小结】

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1