哈希查找_数据结构实验报告
实验16:哈希查找实验报告参考模板

深圳大学实验报告课程名称:数据结构实验与课程设计实验项目名称:哈希查找实验学院:计算机与软件学院专业:软件工程指导教师:杨芳报告人:薛锡增学号:2013150368 班级: 3 实验时间:2014-12-11实验报告提交时间:2014/12/12教务处制一、实验目的1、掌握哈希查找算法的基本思想2、掌握哈希查找表的构造方法3、掌握链表法解决冲突的方法4、掌握哈希查找的时间性能二、实验要求1、熟悉C++语言编程2、了解哈希查找的原理三、实验内容1、问题描述采用散列表方式,对关键字进行查找。
2、查找算法⑴、利用哈希函数(除留余数法,哈希表长为5)及记录的关键字计算出记录的存储地址⑵、直接到指定地址进行查找⑶、如果查找不成功,则采用(表头插入)链地址法,将记录插入到指定地址所在链表的头上。
3、输入⑴、第一行:测试次数。
⑵、每个样本分2行:第一行:第一个数字n表示样本数目,其后跟n个样本;第二行:查找的关键字的值。
4、输出查找是否成功(1—表示成功,0表示不成功),所在位置(从0开始),查找次数。
5、输入样本25 2 4 9 5 746 2 6 8 4 9 176、输出样本1 4 20 2 2四、程序清单#include<iostream>using namespace std;struct node{int data;node* next;node(){next=NULL;}};const int m=11;int main(){node h[15];int n,i,s;node* p;//freopen("cin1.txt","r",stdin);cin>>n;for(i=0;i<n;i++){cin>>s;p=new node();p->data=s;p->next=h[s%11].next;h[s%11].next=p;}int t;cin>>t;while(t--){cin>>s;int sum=1;p=h[s%11].next;while(p){if(s==p->data){cout<<s%11<<" "<<sum<<endl;break;}sum++;p=p->next;}if(!p){cout<<"error"<<endl;p=new node();p->data=s;p->next=h[s%11].next;h[s%11].next=p;}}return0;}五、程序运行时截图流程图:对逐个输入的数据进行除11取余,放到数组相应的位置上输入数据后对其除11取余到数组相应的位置上进行查找,找到就输出数组下标、数组上的第几个结点六、实验心得与体会(实验中遇到的问题及解决方案,或写点感想)哈希查找还没交,对概念不是很懂,在处理问题上也出现不少小细节,不过最后还是做出来了。
哈希实验报告

引言概述:本文旨在对哈希实验进行报告,重点介绍哈希实验的二次探测法、哈希函数、哈希表的查找、插入与删除操作,并分析实验结果。
通过本实验的开展,我们对哈希算法的原理、实现和性能有了更深入的理解,也增加了对数据结构的实践能力。
正文内容:一、二次探测法1.定义与原理2.步骤与流程3.优缺点分析4.实验过程与结果5.实验中的注意事项二、哈希函数1.哈希函数的设计原则2.常见的哈希函数算法3.哈希冲突与解决方法4.哈希函数的优化策略5.实验中的哈希函数选择与应用三、哈希表的查找操作1.哈希表的存储结构与基本操作2.直接定址法查找3.拉链法查找4.其他查找方法与比较5.实验结果与分析四、哈希表的插入与删除操作1.插入操作的实现思路2.插入操作的效率分析3.删除操作的实现思路4.删除操作的效率分析5.实验结果分析与对比五、实验结果与总结1.实验数据的统计与分析2.实验中的问题与解决方案3.实验结论与总结4.对哈希算法的进一步探讨与应用展望5.实验的意义与启示总结:通过对哈希实验的详细阐述,我们对二次探测法、哈希函数、哈希表的查找、插入与删除操作有了更深入的了解。
实验结果与分析表明,在哈希表的实现中,选择合适的哈希函数、解决哈希冲突以及优化插入与删除操作,对提高哈希表的性能至关重要。
哈希算法作为一种重要的数据结构应用,具有广泛的应用前景,在实际问题中具有重要的实践意义。
通过本次实验,我们不仅提升了对数据结构的理论理解,也增强了数据结构算法的实践能力,为今后的学习与研究打下了坚实的基础。
数据结构哈希表的实验报告

课程实习报告一、需求分析:1.本程序来自于图书馆靠书名来检索想要查找的书问题。
2.本程序要求:(1)根据输入建立图书名称表,采用创建散列表实现。
(2)建散列表后,如果想要查找的数据在散列表中输出yes否则输出no。
二、哈希表简介结构中存在关键字和K相等的记录,则必定存储在f(K)的位置上。
由此,不需比较便可直接取得所查记录。
这个对应关系f称为散列函数(Hash function),按这个思想建立的表为散列表。
* 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。
具有相同函数值的关键字对该散列函数来说称做同义词。
* 综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”,作为这条记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
这个现象也叫散列桶,在散列桶中,只能通过顺序的方式来查找,一般只需要查找三次就可以找到。
科学家计算过,当负载因子(load factor)不超过75%,查找效率最高。
* 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。
程序设计流程程序思想(一)哈希函数unsigned int hash_BKDE(char *str)生成映射地址,成为散列表的编号。
(二)哈希表HashTable::HashTable()通过数组储存元素(三)插入函数void HashTable::insert(char*c)插入字符串,先计算要插入字符串生成的映射地址,然后在相应的地址插入,如果没有空位查找空位插入。
(四)查找函数bool HashTable::find(char*c)进行查找,先计算要生成字符串的地址,再到散列表中进行查找比较。
哈工程数据结构实验报告

哈工程数据结构实验报告一、实验目的本实验的目的是通过对于哈工程的数据结构实验的实践操作,掌握并理解数据结构中的哈希表的基本原理、实现方式,以及相关的查找、插入和删除操作。
通过实验的实践操作,进一步加深对于数据结构的理解和运用能力。
二、实验步骤和实验原理1.实验环境本次实验使用的是C++语言在Visual Studio环境下进行开发。
2.实验内容本次实验主要涉及到哈希表的构建和相关操作的实践。
具体步骤如下:(1)首先创建一个结构体,包括学生姓名和学号等信息。
(2)然后定义哈希表的存储结构,其中包括哈希表的大小、装填因子等。
(3)根据哈希表的大小,创建一个存储结点的数组。
(4)实现哈希函数,根据学生学号计算哈希值。
(5)实现插入操作,即将结点插入到哈希表中的合适位置。
(6)实现查找操作,根据学生学号查找对应的结点。
(7)实现删除操作,根据学生学号删除对应的结点。
(8)测试程序的运行效果,包括对哈希表进行插入、查找和删除操作等。
三、实验结果与分析通过对实验的步骤和原理的实践操作,成功构建了一个哈希表,并实现了插入、查找和删除操作。
在实验结果的分析中,可以发现哈希表具有一定的优势:通过哈希函数的映射,可以将元素快速地插入到对应的位置,从而实现了快速的查找和删除操作。
四、实验总结通过本次实验,我对于哈希表的原理、实现方式以及相关操作有了更深刻的理解。
通过实践操作,我进一步加深了对于数据结构的掌握和运用能力。
同时,我也认识到哈希表在实际应用中的重要性和优势,对于提高数据处理和查询效率有着重要的作用。
期待在日后的学习和工作中能够更加深入地学习和应用数据结构的知识,提升自己的技术水平和能力。
查找的算法实验报告

一、实验目的1. 理解并掌握几种常见的查找算法(顺序查找、二分查找等)的原理和实现方法。
2. 分析不同查找算法的时间复杂度和空间复杂度。
3. 通过实际编程,验证不同查找算法的性能差异。
4. 提高算法设计和分析能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 数据结构:列表(List)三、实验内容本次实验主要涉及以下几种查找算法:1. 顺序查找(Linear Search)2. 二分查找(Binary Search)3. 哈希查找(Hash Search)四、实验步骤1. 顺序查找实现顺序查找算法,用于查找列表中是否存在特定元素。
```pythondef linear_search(arr, target):for i in range(len(arr)):if arr[i] == target:return ireturn -1```2. 二分查找实现二分查找算法,要求列表已排序。
```pythondef binary_search(arr, target):low = 0high = len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1```3. 哈希查找实现哈希查找算法,使用哈希表存储数据,提高查找效率。
```pythondef hash_search(arr, target):hash_table = {}for i, num in enumerate(arr):hash_table[num] = ireturn hash_table.get(target, -1)```五、实验结果与分析1. 顺序查找- 时间复杂度:O(n)- 空间复杂度:O(1)2. 二分查找- 时间复杂度:O(log n)- 空间复杂度:O(1)3. 哈希查找- 时间复杂度:O(1)- 空间复杂度:O(n)六、实验结论1. 顺序查找算法简单易实现,但效率较低,适用于数据量较小的场景。
哈希表实验报告

数据结构实验报告四——哈希表查找名字(字符串)实验题目:哈希表查找名字(字符串)实验目标:输入一组名字(至少50个),将其保存并利用哈希表查找。
输出哈希查找冲突次数,哈希表负载因子、查找命中率。
数据结构:哈希表和数组(二维)。
二维数组用于静态顺序存储名字(字符串),哈希表采用开放定址法,用于存储名字(字符串)对应的关键字并实现对名字(字符串)的查找。
需要的操作有:1.关键字求取(主函数中两次出现,未单独编为函数)关键字key=abs(字符串首位ASCII码值-第二位ASCII码值+第([]+1)位ASCII码值-最后一位ASCII码值-倒数第二位ASCII码值)*字符串长度(abs为求整数绝对值的函数)。
2.处理关键字的哈希函数(Hash)利用平方取中法求关键值key在哈希表中的位置。
公式add=(key*key)%1000/LENGTH(add 为key在哈希表中的地址)。
int Hash(int key){return((key*key)/1000%LENGTH);}3.处理哈希表中冲突的函数(Collision)利用线性探测再散列处理冲突,利用全局变量count统计冲突次数。
int Collision(int key,int Hashtable[]){int i;for(i=1;i<=LENGTH;i++){if(Hashtable[(Hash(key)+i)%LENGTH]==-1)return((Hash(key)+i)%LENGTH);count++;}}4.哈希表初始化(InitHash)void InitHash(int Hashtable[]){int i;for(i=0;i<LENGTH;i++)Hashtable[i]=-1;}5.向哈希表中插入关键字(InsertHash)void InsertHash(int key,int Hashtable[]){int add;if(Hashtable[add]==-1)Hashtable[add]=key;else{add=Collision(key,Hashtable);Hashtable[add]=key;}}6.查找关键字在哈希表中的存储位置(SearchHash)int SearchHash(int key,int Hashtable[]){int add;add=Hash(key);if(Hashtable[add]==key)return add;while(Hashtable[add]!=key&&Hashtable[add]!=-1)add=Collision(key,Hashtable);return add;}7.输出哈希表(PrintHash)(帮助调试用)void PrintHash(int Hashtable[]){int i;for(i=0;i<LENGTH;i++)if(Hashtable[i]!=-1)printf("%3d:%d\n",i+1,Hashtable[i]);}8.求字符串长度(strlen)(函数库<string.h>包含)以及求整数的绝对值(abs)(函数库<math.h>包含)算法设计:1建立长度为LENGTH的哈希表Hash(LENGTH具体值由宏定义决定)。
数据结构课程设计哈希表实验报告

数据结构课程设计哈希表实验报告数据结构课程设计哈希表实验报告福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级: xxxxxx班座号: xxxxxxxxxxxx姓名: xxxxxxx12 月 31 日实验题目:哈希表一、要解决的问题针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。
以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。
基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。
完成按姓名查询的操作。
运行的环境:Microsoft Visual C++ 6.0二、算法基本思想描述设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。
建立哈希表而且将其显示出来。
经过要查找的关键字用哈希函数计算出相应的地址来查找人名。
经过循环语句调用数组中保存的数据来显示哈希表。
三、设计1、数据结构的设计和说明(1)结构体的定义typedef struct //记录NA name;NA xuehao;NA tel;}Record;录入信息结构体的定义,包含姓名,学号,电话号码。
typedef struct //哈希表{Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。
2、关键算法的设计(1)姓名的折叠处理long fold(NA s) //人名的折叠处理{char *p;long sum=0;NA ss;strcpy(ss,s); //复制字符串,不改变原字符串的大小写strupr(ss); //将字符串ss转换为大写形式p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}(2)建立哈希表1、用除留余数法构建哈希函数2、用线性探测再散列法处理冲突int Hash1(NA str) //哈希函数{long n;int m;n=fold(str); //先将用户名进行折叠处理m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数return m; //并返回模值}Status collision(int p,int c) //冲突处理函数,采用二次探测再散列法解决冲突{。
数据结构查找实验报告

数据结构查找实验报告一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构查找算法,包括顺序查找、二分查找、哈希查找等,并通过实际编程实现和性能比较,分析它们在不同数据规模和分布情况下的效率和适用场景。
二、实验环境本次实验使用的编程语言为 Python 38,开发环境为 PyCharm。
实验中所使用的数据集生成工具为 numpy 库。
三、实验原理1、顺序查找顺序查找是一种最简单的查找算法,它从数据结构的开头依次逐个比较元素,直到找到目标元素或遍历完整个数据结构。
其平均时间复杂度为 O(n)。
2、二分查找二分查找要求数据结构是有序的。
通过不断将查找区间缩小为原来的一半,直到找到目标元素或者确定目标元素不存在。
其时间复杂度为 O(log n)。
3、哈希查找哈希查找通过将元素映射到一个特定的哈希表中,利用哈希函数计算元素的存储位置,从而实现快速查找。
理想情况下,其平均时间复杂度为 O(1),但在存在哈希冲突时,性能可能会下降。
四、实验步骤1、数据集生成使用 numpy 库生成不同规模和分布的数据集,包括有序数据集、无序数据集和具有一定重复元素的数据集。
2、顺序查找实现编写顺序查找算法的函数,接受数据集和目标元素作为参数,返回查找结果(是否找到及查找次数)。
3、二分查找实现实现二分查找算法的函数,同样接受数据集和目标元素作为参数,并返回查找结果。
4、哈希查找实现构建哈希表并实现哈希查找函数,处理哈希冲突的情况。
5、性能比较对不同规模和类型的数据集,分别使用三种查找算法进行查找操作,并记录每种算法的查找时间和查找次数。
五、实验结果与分析1、顺序查找在无序数据集中,顺序查找的性能表现较为稳定,查找时间随着数据规模的增大线性增长。
但在有序数据集中,其性能没有优势。
2、二分查找二分查找在有序数据集中表现出色,查找时间随着数据规模的增大增长缓慢,体现了对数级别的时间复杂度优势。
然而,在无序数据集中无法使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌航空大学实验报告课程名称:数据结构实验名称:实验九查找班级:学生姓名:学号:指导教师评定:签名:题目:编程实现哈希表的造表和查找算法。
要求:用除留余数法构造哈希函数,用二次探测再散列解决冲突。
一、需求分析1.用户可以根据自己的需求输入一个顺序表(哈希表)2.通过用除留余数法构造哈希函数,并用开放地址的二次探测再散列解决冲突。
3.在经过排序后显示该哈希表。
4.程序执行的命令包括:(1)创建哈希表(2)输出哈希表(3)二次探测再散列解决冲突二、概要设计⒈为实现上述算法,需要顺序表的抽象数据类型:ADT Hash {数据对象D:D是具有相同特征的数据元素的集合。
各数据元素均含有类型相同,可唯一标识数据元素的关键字。
数据关系R:数据元素同属一个集合。
基本操作P:Creathash(&h)操作结果:构造一个具有n个数据元素的哈希查找表h。
destroyhash(&h)初始条件:哈希查找表h存在。
操作结果:销毁哈希查找表h。
displayhash(h)初始条件:哈希查找表h存在。
操作结果:显示哈希查找表h。
hash(h,&k)初始条件:哈希查找表h存在。
操作结果:通过除留余数法得到地址用k返回。
hash2 (i,&k)初始条件:哈希查找表h存在存在,i是除留余数法得到的地址。
操作结果:返回二次探测再散列解决冲突得到的地址k。
search (h,key)初始条件:哈希查找表h存在。
操作结果:查找表h中的key,若查找成功,返回其地址,否则返回-1insert (&h,key)初始条件:哈希查找表h存在。
操作结果:若表h中没有key,则在h中插入key。
search1(h, key,&p)初始条件:哈希查找表h存在。
操作结果:在表h中查找key,若没有,则返回p的插入的地址,否则返回-1。
}ADT Hash2. 本程序有三个模块:⑴主程序模块main(){初始化;{接受命令;显示结果;}}⑵创建hash表的模块:主要建立一个哈希表;⑶解决冲突模块:利用开放地址的二次探测再散列解决冲突;(4)输出哈希表模块:显示已创建哈希表。
三、详细设计⒈元素类型,结点类型typedef struct{int key;}keytype;typedef struct{keytype elem[100];int length; /*当前的长度*/int size; /*哈希表的总长*/}hashtable;/*全局变量*/int a=0,b=0;/*哈希函数*/2.对抽象数据类型中的部分基本操作的伪码算法如下:/*哈希函数*/int hash(hashtable *h,int k){return k%h->size;}/*二次探测再散列解决冲突*/int hash2(int i,int t){ if(i%2==0)t=t+pow(++a,2);elset=t-pow(++b,2);return t;}/*创建哈希表*/void creat(hashtable *h){ int i,j,key,t,p;printf("input hash size and length:");scanf("%d%d",&h->size,&h->length);for(i=0;i<h->size;i++)h->elem[i].key=-1;printf("input data:\n");for(j=0;j<h->length;j++){ scanf("%d",&key);p=hash(h,key);if(h->elem[p].key==-1)h->elem[p].key=key;else{ i=0;t=p;while(h->elem[p].key!=-1&&h->elem[p].key!=key&&i<h->size/2) { p=hash2(i,t);i++;}a=b=0;h->elem[p].key=key;}}}/*查找哈希表中的元素,返回元素的地址,否则返回-1*/int search(hashtable *h,int key){ int p,t,i=0;p=hash(h,key);t=p;while(h->elem[p].key!=-1&&h->elem[p].key!=key&&i<h->size/2) { p=hash2(i,t);i++;}if(h->elem[p].key==key) return p;else return(-1);}/*查找哈希表的元素,返回p的插入的位置*/void search1(hashtable *h,int key,int *p){ int t,s,c=0;t=hash(h,key);s=t;while(h->elem[t].key!=-1&&h->elem[t].key!=key&&c<h->size/2) { t=hash2(c,s);c++;}if(h->elem[t].key==key) *p=t;else{t=-1; *p=t;}}/*插入数据元素到开放地址哈希表中*/void insert(hashtable *h,int key){ int p;p=search(h,key);if(p!=-1) printf("the location is:%d\n",p);else{ search1(h,key,&p);++h->size;++h->length;h->elem[h->size].key=key;}}/*输出哈希表*/void printhash(hashtable *h){ int i;for(i=0;i<h->size;i++)printf("%-4.2d",i);printf("\n");for(i=0;i<2*h->size;i++)printf("--");printf("\n");for(i=0;i<h->size;i++)printf("%-4.2d",h->elem[i].key);}3.主函数和其他函数的伪码算法/*主函数*/void main(){ hashtable t;int i,key,key1,c;creat(&t);printf("output the hash:\n\n");printhash(&t);printf("\n\ncurrent the length is:%d\n",t.length); printf("\ninput a search key:");scanf("%d",&key);c=search(&t,key);if(c!=-1)printf("it's location is:%d\n",c);elseprintf("can't search the key!\n");printf("\n\nadd the key:");scanf("%d",&key1);insert(&t,key1);printf("\n");for(i=0;i<t.size;i++)printf("%-4.2d",i);printf("\n");for(i=0;i<2*t.size;i++)printf("--");printf("\n");for(i=0;i<t.size-1;i++)printf("%-4.2d",t.elem[i].key);printf("%-4.2d",t.elem[++i].key);printf("\n\ncurrent the length is:%d",t.length);getch();}4 函数调用关系mainhash hash2 search search1 hash hash2四、调试分析⒈开始的时候在创建哈希表的时候总是得不到相应的结果,最后发现原来是在creat函数中的i重复利用,使得结果混乱了,为解决这个问题我将该函数中的for语句的i该为j,避免与内while的i发生混乱使用。
⒉在编写hash2函数的时候利用了全局变量a和b,开始的时候在creat函数的镇南关没有加a=b=0;语句使得结果不正确。
3.为使得显示的哈希表比较美观,设计的过程进行了多次的调试。
特别是h->size和h->length有时会用错。
4.算法的时空分析各操作的算法时间复杂度比较合理hash,hash2为O(1);creat,search,search1,insert,printhash为O(n),注:n为哈希表的长度。
(注:也可用平均查找长度ASL)5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使调试也较顺利,各模块有较好的可重用性。
五、用户手册⒈本程序的运行环境为windows xp操作系统,并且在TC2.0中运行,执行文件为Exp9.c;2. 进入演示程序后,完成编译,再点击超级工具集里的中文DOS环境运行选项,进入DOS环境中,用户根据需求键入相应的数据,可以看到相应的结果。
六、测试结果在dos下输入数据元素:88 64 24 75 02 15 68 54 28 39 61并且查找数据元素28和插入数据元素27则在dos界面输入如图所示:七、附录:源程序#include "stdio.h"#include "math.h"#define SIZE 100typedef struct{int key;}keytype;typedef struct{keytype elem[100];int length; /*当前的长度*/ int size; /*哈希表的总长*/ }hashtable;/*全局变量*/int a=0,b=0;/*哈希函数*/int hash(hashtable *h,int k) {return k%h->size;}/*二次探测再散列解决冲突*/int hash2(int i,int t){ if(i%2==0)t=t+pow(++a,2);elset=t-pow(++b,2);return t;}/*创建哈希表*/void creat(hashtable *h){ int i,j,key,t,p;printf("input hash size and length:");scanf("%d%d",&h->size,&h->length);for(i=0;i<h->size;i++)h->elem[i].key=-1;printf("input data:\n");for(j=0;j<h->length;j++){ scanf("%d",&key);p=hash(h,key);if(h->elem[p].key==-1)h->elem[p].key=key;else{ i=0;t=p;while(h->elem[p].key!=-1&&h->elem[p].key!=key&&i<h->size/2) { p=hash2(i,t);i++;}a=b=0;h->elem[p].key=key;}}}/*查找哈希表中的元素,返回元素的地址,否则返回-1*/int search(hashtable *h,int key){ int p,t,i=0;p=hash(h,key);t=p;while(h->elem[p].key!=-1&&h->elem[p].key!=key&&i<h->size/2){ p=hash2(i,t);i++;}if(h->elem[p].key==key) return p;else return(-1);}/*查找哈希表的元素,返回p的插入的位置*/void search1(hashtable *h,int key,int *p){ int t,s,c=0;t=hash(h,key);s=t;while(h->elem[t].key!=-1&&h->elem[t].key!=key&&c<h->size/2){ t=hash2(c,s);c++;}if(h->elem[t].key==key) *p=t;else{t=-1; *p=t;}}/*插入数据元素到开放地址哈希表中*/void insert(hashtable *h,int key){ int p;p=search(h,key);if(p!=-1) printf("the location is:%d\n",p);else{ search1(h,key,&p);++h->size;++h->length;h->elem[h->size].key=key;}}/*输出哈希表*/void printhash(hashtable *h){ int i;for(i=0;i<h->size;i++)printf("%-4.2d",i);printf("\n");for(i=0;i<2*h->size;i++)printf("--");printf("\n");for(i=0;i<h->size;i++)printf("%-4.2d",h->elem[i].key);}/*主函数*/void main(){ hashtable t;int i,key,key1,c;creat(&t);printf("output the hash:\n\n");printhash(&t);printf("\n\ncurrent the length is:%d\n",t.length); printf("\ninput a search key:");scanf("%d",&key);c=search(&t,key);if(c!=-1)printf("it's location is:%d\n",c);elseprintf("can't search the key!\n");printf("\n\nadd the key:");scanf("%d",&key1);insert(&t,key1);printf("\n");for(i=0;i<t.size;i++)printf("%-4.2d",i);printf("\n");for(i=0;i<2*t.size;i++)printf("--");printf("\n");for(i=0;i<t.size-1;i++)printf("%-4.2d",t.elem[i].key);printf("%-4.2d",t.elem[++i].key);printf("\n\ncurrent the length is:%d",t.length); getch();}。