基于Hash表的班级成员管理数据结构课程设计29595982.docx
- 文档编号:10671958
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:23
- 大小:60.19KB
基于Hash表的班级成员管理数据结构课程设计29595982.docx
《基于Hash表的班级成员管理数据结构课程设计29595982.docx》由会员分享,可在线阅读,更多相关《基于Hash表的班级成员管理数据结构课程设计29595982.docx(23页珍藏版)》请在冰豆网上搜索。
基于Hash表的班级成员管理数据结构课程设计29595982
沈阳航空航天大学
课程设计报告
课程设计名称:
数据结构课程设计
课程设计题目:
基于Hash表的班级成员管理
目录
1题目介绍和功能要求
1.1题目介绍
针对本班成员以姓名为关键字设计一个Hash表,使得平均查找长度不超过R。
要求:
1.自行设计至少3中Hash函数;
2.每种Hash函数采用线性探测再散列和伪随机数探测再散列进行冲突处理;
针对本班成员给出每种Hash函数的平均查找长度。
建立一个确定的对应关系f,使每个关键字和结构中的一个唯一的存储位置相对应。
在查找时,只要根据这个对应关系f找到给定值K的像f(K)所建立的表即为哈希表。
1.2功能要求
1.用三种方法创建哈希函数,分别为除留取余法,随机数法和分割法。
2.当哈希地址产生冲突时,利用线性探测再散列和伪随机数探测再散列进行冲突处理得到新的哈希地址,并存入哈希表中。
3.给出每个用户名的查找长度和该函数的平均查找长度,并比较哪种方法最好。
1.3基本功能
1.CreateHashList()建立Hash函数,并采用两种冲突处理方法进行操作。
2.SearchHash()查找Hash表,将用户所输入的信息从Hash表中调出,并给出查找长度
2系统功能模块结构图
2.1系统功能结构框图
创建Hash表
哈希函数模块(除留取余)
哈希函数模块(随机数法)
哈希函数模块(分割法)
冲突处理模块
冲突处理模块
冲突处理模块
冲突处理模块
查找模块
冲突处理模块
冲突处理模块
查找模块
查找模块
图2.1系统功能结构框图
2.2系统主要模块的功能说明
1.哈希模块
CreateHashList();(adr为哈希地址)
初始化Hash表,并创建Hash函数,并将用户姓名添加至Hash表中。
1)除留取余法:
adr=(DATALIST[i].k)%M;(将DATALIST[i].k所存的ASCII码除以M取余所得的哈希地址赋给adr)
2)随机函数法:
srand(DATALIST[i].k);
intadr=rand()%L;(将DATALIST[i].k所存的ASCII码作为种子传入至srand函数中,并用rand函数产生L以内的随机值为哈希地址赋给adr)
3)分割法:
change(DATALIST,A,i);
intadr=A[1]*10+A[2];(DATALIST[i].k所存的ASCII码利用change()函数分割开,并去第二个数字和第三个数字作为哈希地址赋给adr)
2.冲突处理模块
1)srand(姓名ASCII码);
d=(d+rand()%L)%M;
伪随机探测再散列
2)d=d+1;
线性探测再散列
3.查找模块
SearchHash();
查找用户输入姓名是否在Hash表中;
给出该姓名的查找长度和该Hash函数的平均查找长度。
3使用的数据结构的描述
3.1数据结构设计
建立一个确定的对应关系f,使每个关键字和结构中的一个唯一的存储位置相对应。
在查找时,只要根据这个对应关系f找到给定值K的像f(K)为存储地址的结构体数组即为哈希表。
哈希表举例(平方取中法):
ABC……Z012……9
0102033260616271
记录
关键字
(关键字)2
哈希地址(217-29)
A
I
J
I0
P1
P2
Q1
Q2
Q3
0100
1100
1200
1160
2061
2062
2161
2162
2163
0010000
1210000
1440000
1370400
4310541
4314704
4734741
4741304
4745651
010
210
440
370
310
314
734
741
745
表3.1哈希表
3.2数据结构用法说明
取关键字平方后的中间几位为哈希地址。
这是一种比较常用的构造哈希函数的方法。
通常在选定哈希函数时不一定能知道关键字的全部情况,取其中哪几位也不一定合适,而一个数平方后的中间几位数和数的每一位都相关,由此使随即分布的关键字得到的哈希地址也是随即的。
取的位数由表长决定。
如表3.1列出了一些标识符及它们的哈希地址。
4函数的描述
4.1主要函数设计
1.Input();
作用:
将用户姓名换算成ASCII码。
2.CreateHashList();
作用:
将用户名输入至哈希表中,并用两种冲突处理方法进行冲突处理。
3.SearchHash();
作用:
将用户输入的用户名在哈希表中进行查找,并给出查找结果和查找长度,和该函数的平均查找长度。
4.Print();
作用:
打印出程序的主菜单和界面。
5.Change();
作用:
将用户姓名的ASCII码分割为多个数字并存入数组中。
4.2主要函数流程图
1.CreateHashList();
图4.2.1创建函数流程图
2.SearchHash();
图4.2.2查找函数流程图
5程序测试和运行的结果
5.1程序测试
程序开始菜单:
图5.1.1一号菜单图
输入1或者2;
图5.1.2二号菜单图
输入1;
图5.1.3查找图
输入2;
图5.1.4平均查找图
5.2运行结果
给出3组数据,每组数据29个用户名,分别用三种哈希函数和两种冲突处理方法进行操作,结果如图:
1.数据1:
1)除留取余法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
2)随机数法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
3)分割法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
2.数据2:
1)除留取余法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
2)随机数法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
3)分割法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
3.数据3:
1)除留取余法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
2)随机数法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
3)分割法:
(一)线性探测再散列:
(二)伪随机数探测再散列:
结论:
经比较可知,分割法所建立的哈希函数平均查找长度最短。
6参考文献
[1]高富平,张楚.电子商务法[M].北京:
北京大学出版社,2002
[2]HuangSC,HuangYM,ShiehSM.Vibrationandstabilityofarotatingshaftcontainingatransersecrack[J],JSoundandVibration,1993,162(3):
387-401.
[3]谭浩强著.C程序设计(第三版).北京:
清华大学出版社,2005
[4]数据结构:
C语言版/严蔚敏,吴伟明编著.—北京:
清华大学出版社,2007
附录(关键部分程序清单)
#include
#include
#include
#defineL50//哈希表的长度
#defineRAND_MAX10//随机数范围
#defineM47//除留取余数值
#defineNAME_NO29//人名的个数
#defineSUCCESS1
#defineUNSUCESS0
#defineElemTypechar
typedefstructHash//哈希表
{
ElemType*data;
ints;//查找长度
intk;//当前姓名的ASCII码
}Hash;Hashhlist[L];
typedefstructDATE//班级成员
{char*data;//姓名
intk;//姓名ASCII码
}DATA;DATEDATALIST[NAME_NO];
voidinput()//姓名(结构体数组)初始化
{char*m;
intr,s0,i;
DATALIST[0].data="hudi";
DATALIST[1].data="lijing";
DATALIST[2].data="peiting";
DATALIST[3].data="yinhang";
DATALIST[4].data="liulu";
DATALIST[5].data="lishengnan";
DATALIST[6].data="cuililong";
DATALIST[7].data="songchongyuan";
DATALIST[8].data="xiejinhua";
DATALIST[9].data="mashuangmin";
DATALIST[10].data="wangjing";
DATALIST[11].data="qiyueyu";
DATALIST[12].data="gaozhiwei";
DATALIST[13].data="fuzedong";
DATALIST[14].data="shidailong";
DATALIST[15].data="sujun";
DATALIST[16].data="zhangxinglei";
DATALIST[17].data="liuyang";
DATALIST[18].data="liushuxin";
DATALIST[19].data="fengkunkun";
DATALIST[20].data="suzheng";
DATALIST[21].data="sunjianwei";
DATALIST[22].data="mengbaiyu";
DATALIST[23].data="yushaolong";
DATALIST[24].data="lishaolun";
DATALIST[25].data="zhangkuo";
DATALIST[26].data="wangdanran";
DATALIST[27].data="lizhanying";
DATALIST[28].data="yangjun";
for(i=0;i { s0=0; m=DATALIST[i].data; for(r=0;*(m+r)! ='\0';r++) s0=*(m+r)+s0; DATALIST[i].k=s0; } } intCreateHashList()//建立哈希表 { inti,num,sum; printf("请选择冲突处理方法\n"); printf("1.线性探测再散列\n"); printf("2.伪随机数探测再散列\n"); scanf("%d",&num); switch(num) { case1: { for(i=0;i { hlist[i].data=""; hlist[i].k=0; hlist[i].s=0; } for(i=0;i { sum=0; intadr=(DATALIST[i].k)%M;//哈希函数(除留取余) if(i==NAME_NO) break; intd=adr; if(hlist[adr].s==0) { hlist[adr].k=DATALIST[i].k; hlist[adr].data=DATALIST[i].data; hlist[adr].s=1;//此处已有数据 } else { do { d=d+1;//线性探测再散列法处理冲突 sum=sum+1;//查找次数加1 }while(hlist[d].s! =0); hlist[d].k=DATALIST[i].k; hlist[d].data=DATALIST[i].data; hlist[d].s=sum+1; } } return1; }break; case2: { for(i=0;i { hlist[i].data=""; hlist[i].k=0; hlist[i].s=0; } for(i=0;i { sum=0; intadr=(DATALIST[i].k)%M;//哈希函数 if(i==NAME_NO) break; intd=adr; if(hlist[adr].s==0) { hlist[adr].k=DATALIST[i].k; hlist[adr].data=DATALIST[i].data; hlist[adr].s=1;//此处已有数据 } else { do { srand(DATALIST[i].k); d=(d+rand()%L)%M;//伪随机数探测再散列法处理冲突 sum=sum+1;//查找次数加1 }while(hlist[d].s! =0); hlist[d].k=DATALIST[i].k; hlist[d].data=DATALIST[i].data; hlist[d].s=sum+1; } } return2; }break; } } intSearchHash1(char*name,Hashhlist[],int*k)//k为查找次数,线性探测查找 { ints0=0,r,n=1; for(r=0;*(name+r)! ='\0';r++) s0=*(name+r)+s0; intadr=s0%M; if(stricmp(hlist[adr].data,name)==0) { *k=hlist[adr].s; returnSUCCESS; } else { while (1) { if(n>L||strlen(hlist[adr].data)==0) returnUNSUCESS; adr=adr+1; n++; if(stricmp(hlist[adr].data,name)==0) { *k=hlist[adr].s; returnSUCCESS; } } } } intSearchHash2(char*name,Hashhlist[],int*k)//k为查找次数,伪随机数探测查找 { ints0=0,r,n=1;//n为初始查找长度 for(r=0;*(name+r)! ='\0';r++) s0=*(name+r)+s0; intadr=s0%M; if(stricmp(hlist[adr].data,name)==0) { *k=hlist[adr].s; returnSUCCESS; } else { while (1) { if(n>L||strlen(hlist[adr].data)==0) returnUNSUCESS; srand(s0); adr=(adr+rand()%L)%M; n++; if(stricmp(hlist[adr].data,name)==0) { *k=hlist[adr].s; returnSUCCESS; } } } } voidprint() { printf("%*******************************************\n"); printf("****\n"); printf("****\n"); printf("**哈希表**\n"); printf("****\n"); printf("****\n"); printf("****\n"); printf("******************************************\n"); } voi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Hash 班级 成员 管理 数据结构 课程设计 29595982
![提示](https://static.bdocx.com/images/bang_tan.gif)