数据结构与算法-散列表查找操作实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广州XX学院
数据结构与算法实验报告
专业班级计科181 实验日期2019.12.10 姓名XX 学号20181533 实验名称实验6.散列表查找操作指导教师曾岫
一、实验目的
1.熟悉散列查找方法和特点。
2.掌握散列查找解决冲突的方法。
3.用C语言完成算法和程序设计并上机调试通过;
4.撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。
二、实验要求
1、程序要求包含头文件以及main函数
2、实验中所设计的函数(算法)需要满足实验的要求
3、程序的编译、运行要成功通过
4、运行的结果正确,且有相应的提示
三、实验环境
WIND7、VC++6.0或C与C++程序设计学习与实验系统
四、实验内容
1.闭散列表查找的实现
2.开散列表查找的实现
五、源代码及算法分析
1.闭散列表查找的实现
#include "stdio.h"
#define MAXSIZE 20 /* 假定的最大存储单元数 */
typedef int keytype; /* 以整型为元素类型 */
typedef keytype HTable[MAXSIZE]; /* 定义散列表数组 */
/* 用线性探测再散列法处理冲突建立散列表 */
void creHT(HTable HT,int m,int p) /* 创建长度为m的散列表,p为除留余数中的除数 */
{ int i,n=0; keytype x;
for(i=0;i printf("Input datas(-1:End):"); scanf("%d",&x); while(x!=-1) { n++;if(n>m) break; /* n记录散列表中的元素个数 */ i=x%p; /* 计算散列地址 */ while(HT[i]!=-1) /* 线性探测 */ i=(i+1)%m; HT[i]=x; /* 将元素存入空闲单元 */ scanf("%d",&x); } } /* 输出散列表 */ void list(HTable HT,int m) /* 输出长度为m的散列表 */ { int i; for(i=0;i printf("%5d",i); printf("\n"); for(i=0;i printf("%5d",HT[i]); printf("\n"); } /* 查找算法 */ int search(HTable HT,int m,keytype x,int p)/* 在长度为m的散列表中查找关键字为x的元素 */ { int i,j; i=x%p; /* 取地址 */ j=i; while(HT[j]!=-1) { if(HT[j]==x) return j; /* 找到 */ j=(j+1)%m; if(j==i) break; /* 没找到 */ } return -1; } /* 计算查找成功时的平均查找长度 */ float ASLsucc(HTable HT,int m,int p) /* 计算查找成功时的平均查找长度 */ { int i,j,n,s=0; for(i=0,n=m;i { n--;continue;} /* 统计散列表中的元素个数 */ j=HT[i]%p; s+=(m+i-j+1)%m; /* 计算成功查找HT[i]的比较次数,并进行累加 */ } return (float)s/n; } /* 计算查找失败时的平均查找长度 */ float ASLfail(HTable HT,int m,int p) /* 计算查找失败时的平均查找长度 */ { int i,j,k,s=0; for(i=0;i while(HT[j]!=-1) { k++; j=(j+1)%m; if(j==i) break; /* 当元素填满整个空间时的情况 */ } s+=k; /* k为查找失败时的比较次数,并进行累加 */ } return (float)s/p; } main() { HTable HT; int m=9,p=9; keytype key; creHT(HT,m,p); /* 建立散列表,长度为9,散列函数的余数为9。以【例7.8】为例 */ list(HT,m); /* 输出散列表 */ printf("\n"); scanf("%d",&key); /* 输入查找元素 */ printf("%d\n",search(HT,m,key,p)); /* 输出查找结果 */ printf("%6.2f\n",ASLsucc(HT,m,p)); /* 输出查找成功时的平均查找长度 */ printf("%6.2f\n",ASLfail(HT,m,p)); /* 输出查找失败时的平均查找长度 */ } 2.开散列表查找的实现 #include "stdio.h"