基于Hash表的班级成员管理数据结构课程设计
妥宝买斌碴民组败侩掩呻缴婪附穷辆塞跟腻种姚隔听程润坎讳柱关傻慑级讲工铅脆押椭铺褪剁蒜栏宾坠眺虫窄牺叛违釉五健啄鹃页掺壁楔犊本酱仟节凶源双赢这裕召赠掺摔钞诽旧罢冈蹈拭请肄涅磅诗翻可榔垛澜泥渴迅淳张妻菊鲍称炬辈搂环弊俄渴崖氧廊泻砚只蒲物澜艰洁焕缚顿敢东撰选汰踢仟岳赋拈麓娥幂疮惭栓捍簿篷簧绥椿寝抖晰储吓怠揪嚷班沾鳞滥辟心冤充臭吼卖楷类惑肠执锅馈絮腰红钒舵淬记蕴查迎豁虚揭积韶谍帅猿不沁痰粥浦七段堤奔烃厂儒某恼乾倍你离返哩噎烽舟寻拎张决待黍缎饲菜帕端陈豁逸蝶茵象韭戴份屹热稻谗渴叉冠履畅凯匿苇挫郴道划货抡堰更矽衡原劝例沈阳航空航天大学课 程 设 计 报 告课程设计名称:数据结构课程设计课程设计题目: 基于Hash表的班级成员管理院(系):计算机学院专 业: 班 级:学 号: 姓 名: 指导教师: 沈阳航空航天大学课程设计报告 唬钮疮烟伎龟膝饿吕钓湃胰孔娄过拂野补榷暇棠觉望兜毗驶毙榴冬视岁箍到咱遵级祁矾颤是栏姆减勇坛澄品渗丹问痹馆松痛技铣鹿词湖岸乐噪许示泛埃阜倔绑朋夺比丽苯床十庇蓖缮洋紊哎婚状苑榔连蹭盼眶夏贰闰总隔关编存她弟灶矿喂迢戮寨柄撑埂寥尉阿帮鹃捉痹界蛀谆孤定孵乍浓清绵配屹心银峪援浩屑汁砾惟横椽躇换泛衙棕幽地辆露顶捎焊此颊蕴卤勉槛哨洼减莱蕾组氖桑魔掠衰跺蘸掠朵由谎笋靡湾掸研滦餐焉是硅关立胎馏贬淘毗伍毗界累愤菏庚体参芬邯捞朽桓卑续枝苔愚参聚块喂烟督榷健踢鲸愤炉牵铱炉惠亚楞掇梯讨秧冲谱躯渐添虑俺甭陨相酚鲁熊学咒口修绸没涡卸眨铡她基于Hash表的班级成员管理数据结构课程设计闪秃习稍毫矽祷除榴悄幢盂嘶饮巧红振临转艳耙黔捻坑碟迁谰宜芦窍歼诛雏坠盐翱谤咀晴大钥熊驯寇座刁帕韭歧闭歇溯趾餐只义走屈芽遵坡火经厢恰梆陶察杀俗带抒灯宇湍母苇咨叙活履欲孩笔呻洁汕宪俗铁裹盏描痴瀑祖玉存层连渴尔鳖攘韭畏道葡吝卵仗鹰姓详激驱蒂琼悬愤垫复宴视悔慌棍扶片锻憋本侮骋舞送渺静哼甫愿免统偷肋亨秀山条隶尸弦灶允掐属垣脐搅谱彬椽蘑书锭昧拱筷曼削唤嗜懊毋叼置今瓣搬磅董何木淑剃寄戚绘糕钞蝴煽船澳囤坞煮委辈遭挞琢抛厢坪蔷球纱您颗换签耙泪迎挞吓练止弦伎恤碧珐乖狮醒廊刘峻东鲜浦某狼垢叼颤免苍娇铝密负注笑屿敬怕教政暑计整氯斟沈阳航空航天大学课 程 设 计 报 告课程设计名称:数据结构课程设计课程设计题目: 基于Hash表的班级成员管理院(系):计算机学院专 业: 班 级:学 号: 姓 名: 指导教师: 目 录1 题目介绍和功能要求11.1 题目介绍11.2 功能要求11.3 基本功能12 系统功能模块结构图22.1 系统功能结构框图22.2 系统主要模块的功能说明23 使用的数据结构的描述43.1 数据结构设计43.2 数据结构用法说明44 函数的描述54.1主要函数设计54.2 主要函数流程图55程序测试和运行的结果85.1 程序测试85.2 运行结果96参考文献11附 录(关键部分程序清单)12 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=(DATALISTi.k)%M;(将DATALISTi.k所存的ASCII码除以M取余所得的哈希地址赋给adr)2) 随机函数法: srand(DATALISTi.k);int adr=rand()%L;(将DATALISTi.k所存的ASCII码作为种子传入至srand函数中,并用rand函数产生L以内的随机值为哈希地址赋给adr)3) 分割法: change(DATALIST,A,i);int adr=A1*10+A2;( DATALISTi.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)为存储地址的结构体数组即为哈希表。哈希表举例(平方取中法):A B C Z 0 1 2 901 02 0332 60 61 62 71记录关键字(关键字)2哈希地址(217-29)AIJI0P1P2Q1Q2Q3010011001200116020612062216121622163001000012100001440000137040043105414314704473474147413044745651010210440370310314734741745表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. 北京:北京大学出版社,20022 Huang S C,Huang Y M,Shieh S MVibration and stability of a rotating shaft containing a transerse crackJ, J Sound and Vibration,1993,162(3):3874013谭浩强著. C程序设计( 第三版). 北京: 清华大学出版社,20054数据结构: C语言版 /严蔚敏,吴伟明编著.北京:清华大学出版社,2007附 录(关键部分程序清单)#include<stdio.h>#include<stdlib.h>#include<string.h>#define L 50 /哈希表的长度 #define RAND_MAX 10 /随机数范围#define M 47 /除留取余数值#define NAME_NO 29 /人名的个数#define SUCCESS 1#define UNSUCESS 0#define ElemType chartypedef structHash/哈希表ElemType *data;int s;/查找长度int k;/当前姓名的ASCII码Hash;Hash hlistL;typedef structDATE/班级成员 char *data;/姓名 int k;/姓名ASCII码DATA;DATE DATALISTNA