哈希表的设计与实现-数据结构与算法课程设计报告

上传人:bao****ty 文档编号:117281142 上传时间:2019-12-05 格式:DOC 页数:27 大小:336.50KB
返回 下载 相关 举报
哈希表的设计与实现-数据结构与算法课程设计报告_第1页
第1页 / 共27页
哈希表的设计与实现-数据结构与算法课程设计报告_第2页
第2页 / 共27页
哈希表的设计与实现-数据结构与算法课程设计报告_第3页
第3页 / 共27页
哈希表的设计与实现-数据结构与算法课程设计报告_第4页
第4页 / 共27页
哈希表的设计与实现-数据结构与算法课程设计报告_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《哈希表的设计与实现-数据结构与算法课程设计报告》由会员分享,可在线阅读,更多相关《哈希表的设计与实现-数据结构与算法课程设计报告(27页珍藏版)》请在金锄头文库上搜索。

1、合肥学院计算机科学与技术系课程设计报告2009 2010 学年第二学期课程 数据结构与算法课程设计名称哈希表的设计与实现学生姓名王东东学号0804012030专业班级08计本(2)指导教师王昆仑、李贯虹2010 年 5 月课程设计目的“数据结构与算法课程设计”是计算机科学与技术专业学生的集中实践性环节之一,是学习“数据结构与算法”理论和实验课程后进行的一次全面的综合练习。其目的是要达到理论与实际应用相结合,提高学生组织数据及编写程序的能力,使学生能够根据问题要求和数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并用软件解决问题,培养良好的程序设计技能。 一、 问题

2、分析和任务定义1、 问题分析 要完成如下要求:设计哈希表实现电话号码查询系统。实现本程序需要解决以下几个问题:(1) 如何定义一个包括电话号码、用户名、地址的节点。(2) 如何以电话号码和用户名为关键字建立哈希表。(3) 用什么方法解决冲突。(4) 如何查找并显示给定电话号码的记录。(5) 如何查找并显示给定用户名的记录。2 任务定义 1、由问题分析知,本设计要求分别以电话号码和用户名为关键字建立哈希表,z在此基础上实现查找功能。本实验是要我们分析怎么样很好的解决散列问题,从而建立一比较合理的哈希表。由于长度无法确定,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。所以采用链

3、地址法散列算法。采用链地址法,当出现同义词冲突时,可以使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。 根据问题分析,我们可以定义有3个域的节点,这三个域分别为电话号码char num30,姓名char name30,地址char address30。这种类型的每个节点对应链表中的每个节点,其中电话号码和姓名可分别作关键字实现哈希表的创建。 二、 数据结构的选择和概要设计1、数据结构的选择数据结构:散列结构。散列结构是使用散列函数建立数据结点关键词与存储地址之间的对应关系,并提供多种当数据结点存储地址发生“冲突”时的处理方法而建立的一种数据结构。散列结构基本思想,是

4、以所需存储的结点中的关键词作为自变量,通过某种确定的函数H(称作散列函数或者哈希函数)进行计算,把求出的函数值作为该结点的存储地址,并将该结点或结点地址的关键字存储在这个地址中。散列结构法(简称散列法)通过在结点的存储地址和关键字之间建立某种确定的函数关系H,使得每个结点(或关键字)都有一个唯一的存储地址相对应。当需要查找某一指定关键词的结点时,可以很方便地根据待查关键字K计算出对应的“映像”H(K),即结点的存储地址。从而一次存取便能得到待查结点,不再需要进行若干次的比较运算,而可以通过关键词直接计算出该结点的所在位置。2、概要设计 (1)、哈希表的定义结点的数据类型:struct node

5、 /定义 姓名 地址 电话号码 char name30;char address30; char num30; node * next; ; ElemNode; (2)、哈希地址的计算以姓名为关键字的哈希地址计算:从取得的姓名第二个字母开始,取ASCII码累加,对30求余得所求哈希地址以电话号码为关键字的哈希地址计算:从号码第二位开始,将所有号码累加之后对30求模得哈希地址 (3)、拉链法链地址法:在散表结构存放在指针指向的单元中。链地址法在解决冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。采用C语言定义如下:#define Max_length 100T

6、ypedef struct int key; ElemType data; ElemNode *next;ElemNode;Typedef struct ElemNode *first;ElemHeader,HashTableMax_length;所有的同义词构成一个单链表,再由一个表头节点指向这个单链表的第一个节点。这些镖头节点组成一个一维数组,即散列表。数组元素的下标对应由散列函数求出的散列地址。拉链法处理冲突的散列表结构and army breeze buy 1boy 2 egg each 5hash 8(4)链地址法查找结点的算法思想 a、根据查找节点的关键字算出哈希地址b、在散列地址

7、所指向的单链表中依次寻找节点 c、如果找到,输出节点的信息;否则提示没有找到三、 详细设计和编码 主流程图。Main ()初始化散列链表1并为其动态分配内存空间初始化散列链表2并为其动态分配内存空间Menu()主菜单输入选择选择1选9选8查找号码find_num()mm()查找用户find2_name)输出结果输 出结果选择2选择0选择3选择4选择5进行姓名散列list2()姓名散列结果添加记录 apend()退出系统return 0进行号码散列 list()清空creat();creat2()列表已清空号码散列结果结 束开 始以号码为关键字的Hash()函数流程图取整型num2赋给key结束

8、Key=key%20Key=key+(int) numii+i从3开始取numi!=0开 始以姓名为关键字的Hash()函数流程图取整型name0赋给key2结束Key2=key%20Key2+=nameii+i从0开始取namei不为空 开 始添加结点信息流程图:利用用户名为关键字插入拉链法处理冲突调用hash()函数调用hash()函数Newname指向newphoneNewphone=input()结束申请新的结点newphone,newname即新的号码和名字开始申请专利开始 按姓名查找流程图:q不为空结束输出无记录输出相应记录q=q-nextq 不为空调用hash()函数中新结点q指

9、向phonekey-next开始按号码查找流程图:开始调用hash2()函数中新结点q指向phonekey-nextq 不为空q=q-nextq不为空输出无记录输出相应记录结束编码1、建立节点struct node /定义 姓名 地址 电话号码 char name30;char address30; char num30; node * next; ; typedef node* pnode; /声明了已有数据类型的两个指针变量typedef node* mingzi; node *phone; node *nam;2、定义哈希函数这里我们需要定义两个哈希函数,一个以电话号码为关键字,另一个以

10、姓名ASCII之和求模之后的值为关键字。主要方法为将电话号码从第二位开始逐一累加并将所得结果对30求模得哈希地址;第二种则是将姓名字符进行强制类型转换之后得ASCII码相加对30求模得哈希地址。=求哈希地址源代码=void hash(char num30) /哈希函数 /将运算的结果所得的余数作为节点的存储地址 int i = 1; key=(int)num0; while(numi!=NULL) key+=(int)numi; i+; key=key%30; void hash2(char name30) /哈希函数 /将运算的结果所得的余数作为节点的存储地址 int i = 1; key2

11、=(int)name0; while(namei!=NULL) key2+=(int)namei; i+; key2=key2%30; =(3)、添加节点接下来就是每个节点的建立,添加结点,利用链地址法解决冲突。建立结点应包括动态申请内存空间。向结点中输入信息。同时将结点中的next指针等于NULL。添加结点,首先需要利用哈希函数计算出地址即关键字,然后将所得数据插入到链表中。=动态申请内存空间=void create_phone() /新建节点 int i; phone=new pnode30; for(i=0;inext=NULL; void create2_num() /新建节点 int i; nam=new mingzi30; for(i=0;inext=NULL; =添加节点=int apend() /添加节点 node *newphone; node *newname; newphone=input(); newname=newphone; newphone-next=NULL; newname-next=NULL; ha

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号