哈希表实验报告完整版.docx
- 文档编号:28745832
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:12
- 大小:16.38KB
哈希表实验报告完整版.docx
《哈希表实验报告完整版.docx》由会员分享,可在线阅读,更多相关《哈希表实验报告完整版.docx(12页珍藏版)》请在冰豆网上搜索。
哈希表实验报告完整版
实验报告
姓名:
学号:
1.实验题目
针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。
基本要求:
假设人名为中国人姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。
2.需求分析
本演示程序用VC编写,完成哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。
输出形式:
地址,关键字,收索长度,H(key),拼音
3.概要设计
typedefstructNAME
typedefstructhterm
voidInitNameList()
voidCreateHashList()
voidFindList()
voidDisplay()
intmain()
4.详细设计
#include
#include
#include
#defineHASH_LEN50
#defineM47
#defineNAME_NO8
typedefstructNAME
{
char*py;//名字的拼音
intk;//拼音所对应的整数
}NAME;
NAMENameList[HASH_LEN];
typedefstructhterm//哈希表
{
char*py;//名字的拼音
intk;//拼音所对应的整数
intsi;//查找长度
}HASH;
HASHHashList[HASH_LEN];
voidInitNameList()
{
NameList[0].py="houxinming";
NameList[1].py="abc";
NameList[2].py="defdgf";
NameList[3].py="zhangrji";
NameList[4].py="jiaxin";
NameList[5].py="xiaokai";
NameList[6].py="liupeng";
NameList[7].py="shenyonghai";
char*f;
intr,s0;
for(inti=0;i { s0=0; f=NameList[i].py; for(r=0;*(f+r)! ='\0';r++)//方法: 将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字 s0=*(f+r)+s0; NameList[i].k=s0; } } voidCreateHashList() { for(inti=0;i { HashList[i].py=""; HashList[i].k=0; HashList[i].si=0; } for(i=0;i { intsum=0; intadr=(NameList[i].k)%M;//哈希函数 intd=adr; if(HashList[adr].si==0)//如果不冲突 { HashList[adr].k=NameList[i].k; HashList[adr].py=NameList[i].py; HashList[adr].si=1; } else//冲突 { do { d=(d+((NameList[i].k))%10+1)%M;//伪散列 sum=sum+1;//查找次数加1 }while(HashList[d].k! =0); HashList[d].k=NameList[i].k; HashList[d].py=NameList[i].py; HashList[d].si=sum+1; }i++; } } voidFindList() { printf("\n\n请输入姓名的拼音: ");//输入姓名 charname[20]={0}; scanf("%s",name); ints0=0; for(intr=0;r<20;r++)//求出姓名的拼音所对应的整数(关键字) s0+=name[r]; intsum=1; intadr=s0%M;//使用哈希函数 intd=adr; if(HashList[adr].k==s0)//分3种情况进行判断 printf("\n姓名: %s关键字: %d查找长度为: 1",HashList[d].py,s0); elseif(HashList[adr].k==0) printf("无该记录! "); else { intg=0; do { d=(d+s0%10+1)%M;//伪散列 sum=sum+1; if(HashList[d].k==0) { printf("无记录! "); g=1; } if(HashList[d].k==s0) { printf("\n姓名: %s关键字: %d查找长度为: %d",HashList[d].py,s0,sum); g=1; } }while(g==0); } } voidDisplay() { printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t\t拼音\n");//显示的格式 for(inti=0;i<15;i++) { printf("%d",i); printf("\t%d",HashList[i].k); printf("\t\t%d",HashList[i].si); printf("\t\t%d",(HashList[i].k)%M); printf("\t%s",HashList[i].py); printf("\n"); } for(i=15;i<30;i++) { printf("%d",i); printf("\t%d",HashList[i].k); printf("\t\t%d",HashList[i].si); printf("\t\t%d",(HashList[i].k)%M); printf("\t%s",HashList[i].py); printf("\n"); } for(i=30;i<40;i++) { printf("%d",i); printf("\t%d",HashList[i].k); printf("\t\t%d",HashList[i].si); printf("\t\t%d",(HashList[i].k)%M); printf("\t%s",HashList[i].py); printf("\n"); } for(i=40;i<50;i++) { printf("%d",i); printf("\t%d",HashList[i].k); printf("\t\t%d",HashList[i].si); printf("\t\t%d",(HashList[i].k)%M); printf("\t%s",HashList[i].py); printf("\n"); } floataverage=0; for(i=0;i average+=HashList[i].si; average/=NAME_NO; printf("\n\n平均查找长度: ASL(%d)=%f\n\n",NAME_NO,average); } intmain() { printf("\n------------------------哈希表的建立和查找----------------------"); InitNameList(); CreateHashList(); while (1) { printf("\n\n"); printf("1.显示哈希表\n"); printf("2.查找\n"); printf("3.退出\n"); err: charch1; scanf("%c",&ch1); if(ch1=='1') Display(); elseif(ch1=='2') FindList(); elseif(ch1=='3') return0; else { printf("\n请输入正确的选择! "); gotoerr; } } } 5.调试分析 (略) 6.使用说明 程序名为hashtablet.exe,运行环境为DOS。 程序执行后显示 ======================== 1.显示哈希表 2.查找 3.退出 ======================= SELECT: 在select后输入数字选择执行不同的功能。 要求首先输入足够多的插入元素,才可以进行其他的操作。 每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择1: 显示哈希表 选择2: 显示请输入姓名的拼音, 要求输入要删除元素的位置,执行成功后返回元素的值。 选择3: 退出程序 7.测试结果 ------------------------哈希表的建立和查找---------------------- 1.显示哈希表 2.查找 3.退出 1 地址关键字搜索长度H(key)拼音 0000 1000 2000 3000 475614liupeng 5000 6118116shenyonghai 7000 8000 9000 10000 11000 12294112abc 131094113houxinming 14000 15861115zhangrji 16000 17000 18000 19000 20000 21000 22000 23000 24000 25000 26000 27000 28000 29000 30000 31000 32643132jiaxin 33000 34000 35000 36000 37742137xiaokai 38000 39000 40000 41000 42000 43000 44608144defdgf 45000 46000 47000 48000 49000 平均查找长度: ASL(8)=1.000000 1.显示哈希表 2.查找 3.退出 请输入正确的选择! 2 请输入姓名的拼音: houxinming 姓名: houxinming关键字: 1094查找长度为: 1 1.显示哈希表 2.查找 3.退出 请输入正确的选择!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 实验 报告 完整版
![提示](https://static.bdocx.com/images/bang_tan.gif)