第8次数据库实验报告.docx
- 文档编号:5617983
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:15
- 大小:82.59KB
第8次数据库实验报告.docx
《第8次数据库实验报告.docx》由会员分享,可在线阅读,更多相关《第8次数据库实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
第8次数据库实验报告
【实验题目】
实验8.哈希表的设计与实现
【问题描述】
用C或C++语言针对年级中的“人名”设计一个哈希表,使得平均查找长度不超过指定值;并完成相应的建表和查表程序。
【基本要求】
1.可以显示哈希表中的内容
2.可以查找表中的内容,使得平均查找长度不超过指定值
【实现提示】
将字符串各个字符对应的ASC码相加,所得到的整数为哈希表的关键字,对冲突的处理采用伪随即探测法。
一、【概要设计】
1.抽象数据类型的功能规格说明
基本操作:
voidInitNameList()//人名表的初始化
voidCreateHashList()//创建哈希表
voidSearchList()//查找表
voidDisplay()//显示哈希表
2.主程序模块、各子程序模块的伪码说明
结构体的定义:
typedefstruct
{
char*names;
intk;//人名对应的整数
}NAME;
typedefstruct//哈希表
{
char*names;
intk;//人名对应的整数
intsi;//查找长度
}HASH;
voidInitNameList()//人名表的初始化
voidCreateHashList()//创建哈希表
voidSearchList()//查找表
voidDisplay()//显示哈希表
3.主程序模块与各子程序模块间的调用关系
main()
创建哈希表
DSQ
显示哈希表查找关键字退出
结束
二、【详细设计】
1.抽象数据类型具体实现的函数原型说明
voidInitNameList()//姓名初始化
{
char*f;
intr,s0,i;
NameList[0].names="yangkai";
NameList[1].names="tangbo";
NameList[2].names="tommy";
NameList[3].names="tony";
NameList[4].names="mat";
NameList[5].names="jerry";
NameList[6].names="tom";
NameList[7].names="cat";
NameList[8].names="mike";
NameList[9].names="liming";
NameList[10].names="liuwei";
NameList[11].names="juwuba";
NameList[12].names="qingtianzhu";
NameList[13].names="dahuangfeng";
NameList[14].names="xiaolongnv";
NameList[15].names="yangguo";
NameList[16].names="zhaozhijing";
NameList[17].names="yinzhioing";
NameList[18].names="guojing";
NameList[19].names="huangrong";
NameList[20].names="huangyaoshi";
NameList[21].names="ouyangfeng";
NameList[22].names="duanyu";
NameList[23].names="xiaofeng";
NameList[24].names="qiaofeng";
NameList[25].names="xuzhu";
NameList[26].names="azhu";
NameList[27].names="wangyuyan";
NameList[28].names="murongfu";
NameList[29].names="lixiao";
for(i=0;i { s0=0; f=NameList[i].names; for(r=0;*(f+r)! ='\0';r++) /*方法: 将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/ s0=*(f+r)+s0; NameList[i].k=s0; } } voidCreateHashList()//建立哈希表 { inti; for(i=0;i {HashList[i].names=""; 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].names=NameList[i].names; 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].names=NameList[i].names; HashList[d].si=sum+1; } } } voidSearchList()//查找 {charname[20]={0}; ints0=0,r,sum=1,adr,d; printf("请输入姓名的拼音: "); scanf("%s",name); for(r=0;r<20;r++)//求出姓名的拼音所对应的整数(关键字) s0+=name[r]; adr=s0%M;//使用哈希函数 d=adr; if(HashList[adr].k==s0)//分3种情况进行判断 printf("\n姓名: %s关键字: %d查找长度为: 1",HashList[d].names,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].names,s0,sum); g=1; } }while(g==0); } } voidDisplay()//显示哈希表 {inti; floataverage=0; printf("\n地址\t关键字\t\t搜索长度\tH(key)\t姓名\n");//显示的格式 for(i=0;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].names); printf("\n"); } for(i=0;i average+=HashList[i].si; average/=NAME_NO; printf("\n平均查找长度: ASL(%d)=%f\n",NAME_NO,average); } 主函数: voidmain() {charch1; InitNameList(); CreateHashList(); do {printf("本程序为哈希表的实验程序\n"); printf("D.显示哈希表\nS.查找关键字\nQ.退出程序\n请选择需要的操作: "); cin>>&ch1; switch(ch1) { case'D': Display();cout< case'S': SearchList();cout< case'Q': exit(0); } cout<<"是否继续? (y/n): "; cin>>&ch1; }while(ch1! ='n'); } 2.函数的调用关系图 main() InitNameList() CreateHashList() DSQ Display()SearchList()exit(0) 三、【测试结果】 四、【实验总结】 本次试验为哈希表的设计与查找,与普通的表的设计与查找不同,哈希表的设计很灵活,只要使得任何关键字由此所得的哈希函数值都落在表长允许范围内即可。 但这种方法会出现不同的关键字可能得到同一哈希地址,所以要求使用某种方法处理冲突,本次试验采用的是伪随机再散列处理法。 五、【代码】 例如: #include #include #include #defineHASH_LENGTH50//哈希表的长度 #defineM47//随机数 #defineNAME_NO30//人名的个数 typedefstruct { char*names;//名字 intk;//名字所对应的整数 }NAME; NAMENameList[HASH_LENGTH];//全局变量NAME typedefstruct//哈希表 { char*names;//名字的拼音 intk;//拼音所对应的整数 intsi;//查找长度 }HASH; HASHHashList[HASH_LENGTH];//全局变量HASH voidInitNameList()//姓名(结构体数组)初始化 { char*f; intr,s0,i; NameList[0].names="yangkai"; NameList[1].names="tangbo"; NameList[2].names="tommy"; NameList[3].names="tony"; NameList[4].names="mat"; NameList[5].names="jerry"; NameList[6].names="tom"; NameList[7].names="cat"; NameList[8].names="mike"; NameList[9].names="liming"; NameList[10].names="liuwei"; NameList[11].names="juwuba"; NameList[12].names="qingtianzhu"; NameList[13].names="dahuangfeng"; NameList[14].names="xiaolongnv"; NameList[15].names="yangguo"; NameList[16].names="zhaozhijing"; NameList[17].names="yinzhioing"; NameList[18].names="guojing"; NameList[19].names="huangrong"; NameList[20].names="huangyaoshi"; NameList[21].names="ouyangfeng"; NameList[22].names="duanyu"; NameList[23].names="xiaofeng"; NameList[24].names="qiaofeng"; NameList[25].names="xuzhu"; NameList[26].names="azhu"; NameList[27].names="wangyuyan"; NameList[28].names="murongfu"; NameList[29].names="lixiao"; for(i=0;i { s0=0; f=NameList[i].names; for(r=0;*(f+r)! ='\0';r++) /*方法: 将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/ s0=*(f+r)+s0; NameList[i].k=s0; } } voidCreateHashList()//建立哈希表 { inti; for(i=0;i {HashList[i].names=""; 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].names=NameList[i].names; 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].names=NameList[i].names; HashList[d].si=sum+1; } } } voidDisplay()//显示哈希表 {inti; floataverage=0; printf("\n地址\t关键字\t\t搜索长度\tH(key)\t姓名\n");//显示的格式 for(i=0;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].names); printf("\n"); } for(i=0;i average+=HashList[i].si; average/=NAME_NO; printf("\n平均查找长度: ASL(%d)=%f\n",NAME_NO,average); } voidSearchList()//查找 {charname[20]={0}; ints0=0,r,sum=1,adr,d; printf("请输入姓名的拼音: "); scanf("%s",name); for(r=0;r<20;r++)//求出姓名的拼音所对应的整数(关键字) s0+=name[r]; adr=s0%M;//使用哈希函数 d=adr; if(HashList[adr].k==s0)//分3种情况进行判断 printf("\n姓名: %s关键字: %d查找长度为: 1",HashList[d].names,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].names,s0,sum); g=1; } }while(g==0); } } voidmain() {charch1; InitNameList(); CreateHashList(); do {printf("本程序为哈希表的实验程序\n"); printf("D.显示哈希表\nS.查找关键字\nQ.退出程序\n请选择需要的操作: "); cin>>&ch1; switch(ch1) { case'D': Display();cout< case'S': SearchList();cout< case'Q': exit(0); } cout<<"是否继续? (y/n): "; cin>>&ch1; }while(ch1! ='n'); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 实验 报告