预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共13页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

哈希表查找的设计 哈希表查找的设计 哈希表查找的设计 哈希表查找的设计 一.问题描述: 哈希表查找的设计:设哈希表长为20,用除留余数法构造一个哈希函数,以开放定址法中的线性探测再散列法作为解决冲突的方法,编程实现哈希表查找、插入和建立算法。 需求分析: 程序可实现用户与计算机的交互过程。在计算机显示提示信息后,可由用户键入运算命令以实现对应的功能,包含数据的录入、查找、删除、显示等功能。 本程序旨在实现哈希函数的构造与处理存储冲突,因而指定哈希表存储的数据类型为简单的整型数字,在实用性上还有所欠缺。但根据用户需求的变化,可以对程序的基本数据类型进行改造,以实现更为丰富的功能,进而体现哈希表在查找数据时的优越性。 算法思想: 在设定哈希表的抽象数据类型时,要有查找数据元素的操作。另外,插入操作和删除操作也要用到查找数据元素操作,以查看该数据元素是否存在,因此可以设计查找元素操作包括插入和删除操作的查找。 因此,查找操作就有两种情况:一种情况是插入操作时寻找空闲单元的查找;另一种情况是在查找和删除操作时寻找该元素是否在哈希表中已存在的查找。插入操作时寻找空闲单元查找的特征是哈希表中不存在该对象,设计此时查找函数返回该空闲单元位置的“正”值;查找和删除操作时寻找该元素是否在哈希表中已存在的特征是哈希表中已存在该数据元素,设计此时查找函数返回该数据单元位置的“负”值。进而执行后续操作。 为了区分哈希表中每一个表元素的当前状态,为每一个表元素设置一个“标志”定为tag。tag=0表示该元素为空;tag=1表示该元素以存放有数据元素;tag=-1表示该元素中存放的数据元素已被删除。判断当tag为0或—1时都可以进行插入操作。 概要设计: 1.哈希表抽象数据类型的定义: ADTHashTable{ 数据对象:D={ai|ai∈ElemSet,i=1,2,。..n,n≥0} 数据关系:R1={<ai-1,ai>|ai—1∈D,i=1,2,。.。n} 基本操作: Initiate(&h) 操作结果:构造一个空的哈希表h. SearchHash(h,x,p) 初始条件:哈希表h已存在;p为除留余数法中除数,由用户指定。 操作结果:查找表中元素与指定数据x比较。元素已存在时返回其所在位置的负数下标、不存在时返回其位置的正数下标、遍历哈希表后未查找到时返回表长。 Insert(&h,x,p) 初始条件:哈希表h已存在。 操作结果:查找操作后插入元素x至哈希表。若元素已存在或哈希表已满时插入操作失败,返回值为0. Delete(&h,x,p) 初始条件:哈希表h已存在。 操作结果:查找操作后从哈希表中删除元素x.若元素不在表中时删除操作失败,返回值为0。 Print(h) 初始条件:哈希表h已存在。 操作结果:显示哈希表中元素及存储状态. Clear(&h) 初始条件:哈希表h已存在。 操作结果:清空哈希表。 }ADTHashTable 2。程序模块: Hash.h——头文件,包含哈希表抽象数据类型。 Hash。cpp——主程序,为哈希表操作面板。 程序代码: -——-——Hash。h文件—————— #include<malloc。h〉 #include〈iostream.h〉 #include〈iomanip.h〉 #include<process。h> #include〈ctype.h> #defineTableSize20//哈希表长20 #defineSUCCESS1 #defineUNSUCCESS0 typedefintStatus; typedefstruct {//定义元素关键字类型 intkey; }Elemtype; typedefstruct {//定义哈希表中基本单元,包含数据与标志两部分 Elemtypeelem;//数据部分,存放关键字 inttag;//标志部分,tag=0表示表单元为空, //tag=1表示表单元已存放数据元素, //tag=—1表示表单元中存放的数据已被删除 }HashItem; typedefstruct {//定义哈希表,包含表单元数组与当前存储量 HashItemtable[TableSize]; intcurrentSize;//当前哈希表存储量 }HashTable; StatusInitiate(HashTable*h) {//初始化操作 inti; for(i=0;i<TableSize;i++) { (*h)。table[i].tag=0;//tag标志置为0 (*h)。table[i]。elem。key=NULL;//空单元默认值设为NULL } (*h).currentSize=0; returnSUCCE