版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、哈希查找算法的源代码 c语言【问题描述】针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。基本要求假设人名为中国姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构照,用链表法处理冲突。测试数据读取熟悉的30个人的姓名。#include <fstream>#include <iostream>#include <cmath>using namespace std;#define Maxsize 57 struct record char name20;char tel
2、20;char add20;typedef record * precord;struct HashTable int elemMaxsize; /存放数组a的下标int count; ;typedef HashTable * pHashTable;int Number; /统计当前数组a中的记录总数void Getdata(precord a) /从文件telphone.txt中读取数据存放到数组a Number=0;ifstream infile("telphone.txt",ios:in|ios:binary);if(!infile) cout<<&quo
3、t;文件打开失败!n" exit(1);while(!infile.eof() && infile.get()!=EOF) /文件不为空并且文件指针没有指到结束符infile.seekg(Number*sizeof(aNumber),ios:beg); /定位文件指针infile.read(char *)&aNumber,sizeof(aNumber);Number+;infile.close();void Add(precord a) /添加记录 int i,num;cout<<"当前文件内已有"<<Number&
4、lt;<"条记录n"cout<<"请输入添加的个数:"cin>>num;ofstream ofile("telphone.txt",ios:app);if(! ofile) cout<<"文件打开失败!" exit(1); for(i=0;i<num;i+) cout<<"请输入第"<<Number+1<<"个人的姓名"<<endl;cin>>aN;
5、 cout<<"请输入第"<<Number+1<<"个人的电话"<<endl;cin>>aNumber.tel; cout<<"请输入第"<<Number+1<<"个人的地址"<<endl;cin>>aNumber.add; ofile.seekp(ios:end);ofile.write(char *)&aNumber,sizeof(aNumber);Number+;ofile.clos
6、e();void Print(precord a) /显示所有记录 int i;for(i=0;i<Number;i+)cout<<"第"<<i+1<<"个人的信息为:n"cout<<" 姓名:"<<<<endl;cout<<" 电话:"<<ai.tel<<endl;cout<<" 地址:"<<ai.add<<endl;int Has
7、h(char str) /除留取余 long val=0;char p20,*p1;strcpy(p,str);p1=p;while(*p1!='0')val=val+*p1+; /将字符串中的所有字符对应的ASCII值相加return(val%Maxsize);int derter; /线性增量int Line_Sollution(int address) /采用线性探测解决冲突 derter+;if(derter=Maxsize) return(-1);else return(address+derter)%Maxsize);int n;int Square_Solluti
8、on(int address) /采用平方探测法解决冲突 int j;derter+;if(derter=Maxsize) return -1;n=n*(-1);j=(int(pow(derter,2)*n+address)%Maxsize;return(j);void Init_Hash(pHashTable h) /初始化哈希表 int i;for(i=0;i<Maxsize;i+)h->elemi=-1;int menu;void Creathash_Name(pHashTable h,precord a)/以用户名为关键字创建哈希表 cout<<"-n
9、"cout<<" 1-以线性探测建表n"cout<<" 2-以平方探测建表n"cout<<"-n"int i,address;cin>>menu;Init_Hash(h);for(i=0;i<Number;i+) derter=0;n=-1;address=Hash();while(h->elemaddress!=-1)if(menu=1) address=Line_Sollution(address);else address=Square_Soll
10、ution(address);if(address=-1) break;if(address!=-1) h->elemaddress=i; h->count+;cout<<"姓名哈希表已成功建立!n"void Search_Name(pHashTable h,precord a) /查找并显示指定姓名的记录 cout<<"请输入要查找的姓名:"char nam20;int address,i=1;cin>>nam;address=Hash(nam);derter=0;n=-1;while(h->ele
11、maddress!=-1 && strcmp(nam,ah->)!=0) if(menu=1) address=Line_Sollution(address);else address=Square_Sollution(address);i+;if(address=-1) break;if(h->elemaddress!=-1 && strcmp(nam,ah->)=0) cout<<"你要查找的信息为:n"cout<<" 姓名
12、:"<<ah-><<endl;cout<<" 电话:"<<ah->elemaddress.tel<<endl;cout<<" 地址:"<<ah->elemaddress.add<<endl;cout<<"比较次数为"<<i<<endl;else cout<<"无此姓名,查找失败!"void Creathash_te
13、l(pHashTable h,precord a) /以电话号为关键字创建哈希表 cout<<"-n"cout<<" 1-以线性探测建表n"cout<<" 2-以平方探测建表n"cout<<"-n"int i,address;cin>>menu;Init_Hash(h);for(i=0;i<Number;i+) derter=0;n=-1;address=Hash(ai.tel);while(h->elemaddress!=-1)if(menu
14、=1) address=Line_Sollution(address);else address=Square_Sollution(address);if(address=-1) break;if(address!=-1) h->elemaddress=i; h->count+;cout<<"电话号哈希表已成功建立!n"void Search_tel(pHashTable h,precord a)/查找并显示指定电话号的记录 cout<<"请输入要查找的电话:"char telphone20;int address,i
15、=1; /i统计比较次数cin>>telphone;address=Hash(telphone);derter=0; n=-1; /初始化线性增量while(h->elemaddress!=-1 && strcmp(telphone,ah->elemaddress.tel)!=0) if(menu=1) address=Line_Sollution(address);else address=Square_Sollution(address);i+;if(address=-1) break;if(h->elemaddress!=-1 &&a
16、mp; strcmp(telphone,ah->elemaddress.tel)=0) cout<<"你要查找的信息为:n"cout<<" 姓名:"<<ah-><<endl;cout<<" 电话:"<<ah->elemaddress.tel<<endl;cout<<" 地址:"<<ah->elemaddress.add<<endl;cout&
17、lt;<"比较次数为"<<i<<endl;else cout<<"无此电话,查找失败!"void Menu() /功能菜单函数for(int i=1;i<=5;i+)cout<<endl;cout<<" 电话号码查询系统n"cout<<'n'cout<<" n"cout<<" 0-退出 n"cout<<" 1-添加 n"cout<<
18、;" 2-显示所有 n" cout<<" 3-以性命建立哈希表 n"cout<<" 4-以电话建立哈希表 n"cout<<" 5-按用户名查找 n"cout<<" 6-按电话号查找 n"cout<<" n"cout<<" 使用说明:n"cout<<" 1.添加新纪录后,如要进行查找请先进行3或4操作n"cout<<" 2.按用户名查
19、找之前,请先进行3操作建立用户名哈希表n"cout<<" 3.按用户名查找之前,请先进行4操作建立电话号哈希表n"void exit() int i;for(i=1;i<=4;i+)cout<<endl;cout<<" n"cout<<" n"cout<<" 电 话 号 码 查 询 系 统 n"cout<<" n"cout<<" 谢 谢 您 的 使 用 ! n"cout<<" n"cout<<" n"int main() record aMaxsize;pHashTable H=new HashTable;Getdata(a); /将文件中的数据读入到数组a中start:Menu();int menu1;cin>>menu1;switch(menu1) case 0:system(&q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版急性肠道感染典型症状及护理方法
- 2025年防疫社工面试真题及答案
- 2025年一级锅炉考试试题及答案
- 2025租赁合同司法释义
- 青岛市中医院呼吸科质控医师岗位竞聘医疗质量改进案例集
- 物联网实时监控方案-洞察与解读
- 台州市人民医院复发性流产诊疗考核
- 2025购房合同协议书
- 三明市人民医院试管婴儿技术临床操作资格认证
- 徐州市中医院病原体核酸检测考核
- 农村厨房翻建申请书
- 网红集装箱商业街方案
- 文库发布:《青鸟》课件
- 2025年上半年银行从业初级考试真题及答案
- 安全生产检查考核办法
- 2025年度济南市工会社会工作专业人才联合招聘(47人)笔试参考题库附答案解析
- 幽门螺旋杆菌治疗指南
- 2025年遗传病诊断技术应用考核考试答案及解析
- 内镜治疗脑出血课件
- 浙江入团考试题目及答案
- 冠脉动脉介入课件
评论
0/150
提交评论