数据结构与算法-散列表查找操作实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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"

相关文档
最新文档