版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程名称:数据结构 XXXXXXXX本科学生课程设计论文题 目 哈希表的设计与实现 姓 名 XXX 学 号 XXXXXXXXXXXX 学 部 计算机科学与技术 专业、年级 计算机科学与技术 大二 指 导 教 师 XX 2021 年 11月 28日摘 要随着信息技术的开展,关于各种程序中的数据结构也是层出不穷,对于工程某一方面的计算或者是某一方面的研究,出现了专门的数据结构,哈希表就是其中之一,哈希表作为另类的一种数据结构,其作用也是区别于其它同类的数据结构的,它是由两局部组成的:键(key)和值,通过键可以迅速的查找到你需要的值。常见的构造哈希函数的方法有直接定址法 除留余数法 平方取中法 数
2、字分析法等。一般创立哈希表时可能会出现很多的冲突,常用的处理冲突的方法为开放定址法 再哈希法 链地址法 建立一个公共溢出区。关键词: 数据结构;哈希表;键(key);目 录第1章前言与系统实现2前言2系统实现31.2.1 开发环境31.2.2 Visual C+环境的安装3第2章 系统功能分析42.1 系统功能需求分析42.2 任务定义4第3章 总体设计5系统数据结构5主要算法流程图63.2.1 以姓名为关键字的CreateHashList()函数流程图63.2.2 哈希表查找算法流程图7主程序流程图8第4章 详细设计和编码9节点的建立94.2 对哈希函数的定义94.3 创立哈希表算法、代码如
3、下所示:104.3.1 算法10代码10哈希查找11显示哈希表14主菜单设计164.7 主函数设计16第5章 程序运行测试19程序主界面19哈希表初始化19按姓名查找记录21显示哈希表全部记录22总结23参考文献24 第1章 前言与系统实现在信息化时代的今天,计算机技术已经是开展到一个很可观的地步了,特别是面向窗口的操作系统的出现,使得程序设计更加的容易了。在过去计算机内存容量小,CPU计算速度慢,关于程序设计中的数据结构也因此提出来很多的关于解决这方面的问题。哈希表就是其中之一,哈希表是一个由关键字与值组成的特殊的一种数据结构。它的出现主要是为了解决在结构中查找记录时需要进行一系列和关键字的
4、比拟,这一类查找方法是建立在“比拟的根底上的,在顺序等的查找中,查找的效率是依赖于查找过程中所比拟的次数。理想的情况是希望不经过任何的比拟一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系,使得每个关键字和结构中一个唯一的存储位置相对应。因而在查找时只要根据这个对应关系找到给定的值的像。假设结构中存在关键字和该值相等的记录,那么所要查找的数就必定就是这个所查找到的记录。哈希函数是建立哈希表的一个重要的成员,它的构造方法分为以下几种:直接定址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法。本程序中主要用的是除余取留法,除留取余法主要是取关键字被某个
5、不大于哈希表表长m的数p出后所得余数为哈希地址即:H(key)=key MOD p, p<=m,这是一种最简单,也是一种最常用的构造函数的方法,它不仅可以对关键字直接取模,也可在折叠、平方中等运算之后取模。 在哈希表的建立中,很容易出现同义词,这些同义词的出现也导致了建立哈希表时冲突的出现,如果不解决这些冲突那么建立好的哈希表与预料的哈希表不同。关于处理冲突的方法主要有:开放定址法、再哈希法、链地址法。本程序中主要用的就是链地址法莱解决冲突的。本程序是在Vc+6.0环境下编写 测试运行的。1. 开发环境表1-1列出了系统硬件配置,表6-2列出了系统软件配置。设备名称配置CPUE1内存12
6、8MB硬盘40GB 表1.1 组装台式机配置设备名称版本操作系统Windows XP sp3开发环境Visual Studio C+设计工具VC+表1.2 软件环境 Visual C+环境的安装在计算机中安装Visual C+安装程序,Visual C+应用程序的开发主要有两种模式,一种是WIN API方式,另一种那么是MFC方式,传统的WIN API开发方式比拟繁琐,而MFC那么是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势。本软件中因为程序主要是为了实现某个算法所以这里没有用到MFC。第2章 系统功能分析 系统功能需求分析实现本程序需要解决以下几个问题:1.
7、设计一个结点使该结点包括 号码、用户名、QQ等结点信息。2. 利用用户名为关键字建立哈希表,哈希函数用除留余数法构照。3. 利用链表法处理冲突问题。4. 实现用哈希法查找并显示给定姓名的记录。5. 显示哈希表中的全部记录。 任务定义由功能需求分析知,本设计主要要求以用户名为关键字建立哈希表,并实现查找功能。所以本设计的核心问题是如何解决散列的问题,亦即设计一个良好的哈希表。根据题目的要求采用链地址法散列算法。当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。首先,解决的是定义链表结点,在链地址法中,每个结点对应一个链表结点,它由六个域组成,而由于该
8、程序需要用用户名为关键字建立哈希表,所以该链表结点它是char strName20;char strClass20;char strPhone11;char strqq10; int num; char strAddress 六个数据域和struct Name *next 一个地址域组成。构造哈希表的函数主要是用除留取余法来构造哈希函数的。冲突的解决采用链地址法,具体的实现思想是,所有同义词构成一个单链表,再由一个表头结点指向这个单链表的第一个结点。这些表头结点组成一个一维数组,即哈希表。数组元素的下标对应由散列函数求出的散列地址。 第3章 总体设计系统数据结构本设计涉及到的数据结构为:哈希表
9、。程序中建立了两个结构体,要求输入 号码、用户名、QQ、地址、四个信息,给struct Name结构体变量,在创立哈希表时哈希函数用除留余数法构照,并把struct Name结构体中的数据赋值给哈希表结构体。在链地址法中,每个结点对应一个链表结点,它由六个域组成,链地址法结点结构如表:strName20numstrAddress30strPhone11strClass20Nqqnext表 其中哈希表是以用户名为关键字 next指针是用来指向下一个结点的地址。具体的存储结构如下列图所示: 数据结构存储图 以姓名为关键字的CreateHashList()函数流程图 建立第一个结点开始结束初始化结构
10、体指针域为NULL定义i=0i<30int adr=(NameListi.num)%M;HashListadr.next!=NULLi+解决冲突结点的建立struct Hlist *q;pName *p,*m;q指向所要插入结点的地址,m指向所要插入结点指针的下一地址查找该地址的最后一个地址图 3.23.2.2 哈希表查找算法流程图 查找到的数据结束开始输出查找到的信息定义数组name 整型变量adr =0,s=0,r=0 r<20adr=s%M;输入查找姓名s+=namer;r+HashListadr.next!=NULL无该记录判断记录的关键字与s相等HashListadr.n
11、ext)->next=NULL地址中单链表的循环遍历查找图 3.3主程序流程图Main ()定义int变量i,f=0InitNameList(); Menu主菜单开始无限循环输入选择1-4选择1选择2选择3选择4defaultCreateHashList(); CreateHashList();f=1f=1f=1哈希表未初始化哈希表未初始化Display();SearchList();return 0选择错误,请从新输入结束图 3.4第4章 详细设计和编码4.1节点的建立定义结构体如下所示:typedef struct Namechar strName20;/姓名 char strCla
12、ss20;/班级char strPhone11;/ 号码char strAddress30;/地址char Nqq10;/QQint num;/关键字struct Name *next;pName;pName NameListHASH_LEN;pName k;struct HlistpName *next;HashListHASH_LEN; 对哈希函数的定义本程序设计一个hash()函数,本设计中按照题意要求知对散列函数选择的是除留余数法,即对关键字进行模运算,将计算结果所得的余数作为关键字或结点的存储地址,即H(key)=key mod p,在程序中p取的值为范围内的最大的素数,以用户名为关
13、键字建立哈希函数CreateHash(),利用强制类型转换将用户名的每一个字母的ASCLL码值相加并且除以范围内最大的素数,将计算出来的数作为该结点的地址赋给adr。然后通过以下几种方式就可以完成哈希表程序的设计了。4.3 创立哈希表算法、代码如下所示: 算法建立结点,并添加结点,利用链地址法解决冲突。建立结点应包括动态申请内存空间。向结点中输入信息。同时将结点中的next指针等于null。添加结点,首先需要利用哈希函数计算出地址即关键字,其次将该结点插入以关键字为地址的链表后。代码void CreateHashList()int i; for(i=0; i<HASH_LEN; i+)H
14、ashListi.next=NULL;for(i=0; i<2; i+)struct Hlist *q;pName *p,*m;int adr=(NameListi.num)%M;/哈希函数if(HashListadr.next=NULL)/说明不冲突 HashListadr.next=&NameListi;else/说明冲突q=&HashListadr;m=q->next;while(m->next!=NULL) m=m->next;p=(pName *)malloc(sizeof(pName); strcpy(p->strName,NameLi
15、sti.strName);strcpy(p->strPhone, NameListi.strPhone);strcpy(p->strAddress,NameListi.strAddress);strcpy(p->Nqq, NameListi.Nqq);p->num=NameListi.num; m->next=p;/单链表向后指哈希查找想要实现查找功能,需要一个查找函数,以用户名为关键字来实现查找,首先,需要利用hash函数来计算出地址。再通过比对,如果该地址中的用户名拼音字符相加的num与查找的相同那么输出该结点的所有信息,否那么输出“无此记录。具体实现代码如下
16、所示:void SearchList()system("cls");char *f;printf("nn请输入你要查找姓名拼音");/输入姓名char name20;scanf("%s",name);f=name;int s=0, r;for(r=0; *(f+r)!='0' r+)/求出姓名的拼音所对应的整数也就是关键字s+=(int)*(f+r);/利用字符与整数的自动转换相加字符的ASCII码int adr=s%M;/使用哈希函数if(HashListadr.next=NULL)/通过指针的指向判断一个单链表中是
17、否存在要查找的数printf("无该记录");elseif(HashListadr.next)->next=NULL) if(HashListadr.next)->num=s) int i=1; printf(“n姓名:%s, (HashListadr.next)->strName); printf(“班级:%s, (HashListadr.next)->strClass); printf(“ :%s, (HashListadr.next)->strPhone); printf(“QQ:%s, HashListadr.next)->Nqq
18、); printf(“地址: %sn, (HashListadr.next)->strAddress); printf(“关键字:%d, (HashListadr.next)->num); printf(“查找长度:%d, i);else pName *m; int i=1; m=HashListadr.next; while(m->next!=NULL)/循环该单链表查找出你所要查找的数据并把他们输出 if(m->num=s) Printf(“n姓名:%s, m->strName); Printf(“班级:%s, m->strClass); Printf(
19、“ :%s, m->strPhone); Printf(“QQ:%s, m->Nqq);Printf(“地址: %s, m->strAddress);Printf(“关键字:%d, m->num); printf("查找长度:%d", i); break; m=m->next; i+;显示哈希表 通过姓名关键字,循环查找有值的下标并输出来,具体设计代码如下:void Display() system("cls");int i, s, j, adr, n=0;char *f;struct Hlist *m;struct Nam
20、e *k;char name20;printf("nn下标地址t关键字tH(key)t拼音 班级 QQ 地址 n"); /显示的格式for(i=0; i<2; i+)s=0;strcpy(name,NameListi.strName);f=name;for(j=0; *(f+j)!='0' j+) s+=(int)*(f+j);adr=s%M;m=&HashListadr;if(m->next!=NULL) k=m->next; n+=1; while(k->next!=NULL) printf("下标地址:%d&q
21、uot;,i); printf("t%d ",k->num); printf("t%d ",(k->num)%M); printf("t %s ",k->strName); printf(" %s",k->strClass);printf(" %s",k->Nqq);printf(" %s",k->strAddress);printf(" %s",k->strPhone); printf("n"
22、); k=k->next; printf("下标地址:%d",i);printf("t%d ",k->num); printf("t%d ",(k->num)%M); printf("t %s ",k->strName); printf(" %s",k->strClass); printf(" %s",k->Nqq); printf(" %s",k->strAddress); printf(" %s&qu
23、ot;,k->strPhone); printf("n"); 主菜单设计 根据题目中的要求我们只要写出哈希表的初始化 查找 显示三个功能,代码如下所示:void Menu() printf("n-哈希表的建立和查找操作-"); printf("nn"); printf(" 1. 哈希表初始化n"); printf(" 2. 显示哈希表n"); printf(" 3. 查找n"); printf(" 4. 退出n");4.7 主函数设计 主函数是一个软
24、件运行的入口,其通过调用自定义函数来完成相应的功能,其实现代码如下所示:int main(int argc, char *argv) int i,f=0; while(1) Menu(); scanf("%d",&i); switch(i) case 1: InitNameList(); CreateHashList(); f=1;break; case 2: if(f=1) Display(); break; else printf("哈希表未初始化请先初始化再操作"); break; case 3: if(f=1) SearchList();
25、 elseprintf("哈希表未初始化请先初始化再操作"); break; case 4:return 0; default:printf("请输入正确的选项"); break; 第5章 程序运行测试5.1程序主界面图5.1 程序主界面5.2哈希表初始化 测试数据(正确): 姓名:kaluo班级:305 :123456789 地址:长沙涉外 QQ:282265478 姓名:tianxia 班级:306 :987654321 地址:长沙理工 QQ:974562228 姓名:xiantu 班级:3076 :987654322 地址:长沙学院 QQ:974562222 测试数据(错误): 姓名:张三(否拼音) 班级:3077 :987654322 地址:长沙学院 QQ:974562222姓名:李四(否拼音) 班级:3078 :987654322 地址:长沙学院 QQ:974562222图5.2 哈希表正确初始化 哈希表的错误初始化 哈希表初始化5.3按姓名查找记录图5.5 输入查找条件 图5.6 查找结果 5.4显示哈希表全部记录图5.7 显示表中全
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国甜菊糖甙项目经营分析报告
- 抄作业演讲稿
- 视图库协议书文档
- 2026年中国木油桐项目经营分析报告
- UNIT单元复习人教版高中英语选择性必修第四册教案(2025-2026学年)
- 荷花合集教案(2025-2026学年)
- 幼儿园区角布置教案幼儿园区角游戏教案(2025-2026学年)
- 完整版劳动最光荣主题班会教案(2025-2026学年)
- 自愿住校协议书
- 物理教案怎样认识力(2025-2026学年)
- 2024年国家开放大学电大开放英语考试题题库
- 《涡流检测》课件
- 数电票商品税收分类编码表
- MOOC 光学发展与人类文明-华南师范大学 中国大学慕课答案
- 设备安装监理细则
- 大创申报答辩ppt
- 《活出最乐观的自己》读书笔记思维导图PPT模板下载
- 高中地理 人教版 选修二《资源、环境与区域发展》第五课时:玉门之变-玉门市的转型发展
- 催化加氢技术(药物合成技术课件)
- 近三年(2023-2023年)广西物理学业水平考试试题
- 建筑结构检测与加固课程复习考试试题及答案B
评论
0/150
提交评论