哈希查找算法的源代码 c语言

上传人:碎****木 文档编号:220862683 上传时间:2021-12-09 格式:DOCX 页数:8 大小:12.99KB
返回 下载 相关 举报
哈希查找算法的源代码 c语言_第1页
第1页 / 共8页
哈希查找算法的源代码 c语言_第2页
第2页 / 共8页
哈希查找算法的源代码 c语言_第3页
第3页 / 共8页
亲,该文档总共8页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《哈希查找算法的源代码 c语言》由会员分享,可在线阅读,更多相关《哈希查找算法的源代码 c语言(8页珍藏版)》请在金锄头文库上搜索。

1、哈希查找算法的源代码 c 语言【问题描述】针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过 R, 完成相应的建表和查表程序。根本要求假设人名为中国姓名的汉语拼音形式。待填入哈希表的人名共有 30 个,取平均查找长度的上限为 2。哈希函数用除留余数法构照,用链表法处理冲突。测试数据读取生疏的 30 个人的姓名。#include #include #include using namespace std; #define Maxsize 57 struct record char name20; char tel20; char add20;typedef record * pr

2、ecord;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“文件翻开失败!n“; exit(1);while(!infile.eof() & infile.ge

3、t()!=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“条记录n“; coutnum;ofstream ofile(“telphone.txt“,ios:app);if(! ofile) cout“文件翻开失败!“; exit(1); for(i

4、=0;inum;i+) cout“请输入第“Number+1“个人的姓名“aNumber.name;cout“请输入第“Number+1“个人的 “aNumber.tel;cout“请输入第“Number+1“个人的地址“aNumber.add;ofile.seekp(ios:end);ofile.write(char *)&aNumber,sizeof(aNumber); Number+;ofile.close();void Print(precord a) /显示全部记录 int i; for(i=0;iNumber;i+)cout“第“i+1“个人的信息为:n“; cout“ 姓名:“a

5、i.nameendl; cout“ :“ai.telendl; cout“ 地址:“ai.addendl;int Hash(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 r

6、eturn(address+derter)%Maxsize);int n;int Square_Sollution(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;ielemi=-1;int menu;void Creathash_Name(pHashTable h,precord

7、 a)/以用户名为关键字创立哈希表 cout“-n“;cout“ 1以线性探测建表n“;cout“ 2以平方探测建表n“;coutmenu; Init_Hash(h); for(i=0;ielemaddress!=-1)if(menu=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_Name(pHashTab

8、le h,precord a) /查找并显示指定姓名的记录 coutnam;address=Hash(nam); derter=0;n=-1;while(h-elemaddress!=-1 & strcmp(nam,ah-elemaddress.name)!=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-elemaddress.name)=0) co

9、ut“你要查找的信息为:n“;cout“ 姓名:“elemaddress.nameendl; cout“ :“elemaddress.telendl; cout“ 地址:“elemaddress.addendl; cout“比较次数为“iendl;else cout“无此姓名,查找失败!“;void Creathash_tel(pHashTable h,precord a)/以 号为关键字创立哈希表 cout“-n“;cout“ 1以线性探测建表n“;cout“ 2以平方探测建表n“;coutmenu; Init_Hash(h); for(i=0;ielemaddress!=-1)if(men

10、u=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)/查找并显示指定 号的记录 couttelphone; address=Hash(telphone); derter=0; n=-1; /初始化线性增量while(h-elemaddress!=-1&s

11、trcmp(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 & strcmp(telphone,ah-elemaddress.tel)=0) cout“你要查找的信息为:n“;cout“ 姓名:“elemaddress.nameendl; cout“ :“elemaddress.telendl; cout“ 地址:“elemaddress.addendl; cout“比较次数为“iendl;else cout“无此 ,查找失败!“;void Menu() /功能菜单函数for(int i=1;i=5;i+) coutendl;cout“ 号码查询系统n“; cout”n”;cout“ n“; cout“ 0-退出 n“;cout“ 1-添加

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号