哈希表的设计与实现复习进程.doc
《哈希表的设计与实现复习进程.doc》由会员分享,可在线阅读,更多相关《哈希表的设计与实现复习进程.doc(24页珍藏版)》请在咨信网上搜索。
1、哈希表的设计与实现精品文档令胆 嗲 院计算机科 嗲 b 练 水 系课程设计报告20072008 学年第2学期课程数据结构与算法课 程 设 计 名 称哈希表的设计与实现学生姓名学号0604011026专业班级06 计科(1)指导教师2008年9月收集于网络,如有侵权请联系管理员删除 课程设计题目:(哈希表的设计与实现的问题 设计哈希表实现电话号码查询系统。设计程序完成以下 要求 :(1) 设每个记录有下列数据项:电话号码、用户名、地址:(2) 从键盘输入各记录 , 分别以电话号码和用户名为关键字建立晗希表 ;(3) 采用再哈希法解决冲突;(4) 查找并 显示给定电话号码的记录 :(5) 查找并显
2、示给定用户的记录。一、 问题分析和任务定义1、问题分析要完成如下要求 :设计晗希表实现电话号码查询系统。 实现本程序需要解决以下几个问题:(1)如何设计一个结点使该结点包括电话号码、用户名、地址。(2)如何分别以 电话号码和用户名为关键字建立哈希表 。(3)如何利用再晗希法解决冲突。(4)如何实现用晗希法查找并显示给定电话号码的记录 。(5)如何查找并显示给定用户的记录 。2、任务定义由问题分析知,本设计主要要求分别以电话号码和用户名为关键字建立晗希表 ,并实现 查找功能 。所以本设计的核心问题是如何解决散列的问题,亦即设计一个良好的哈希表。由 于结点的个数无法确认,并且如果采用线性探测法散列
3、算法 ,删除结点会引起 “信息丢失” 的问题。所以采用链地址法散列算法 。采用链地址法 ,当出现同义词冲突时,使用链表结构 把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址 。首先,解决的是定义链表结点,在链地址法中,每个结点对应一个链表结点,它由三个 域组成,而由于该程序需要分别用电话号码和用户名为关键字建立晗希表 ,所以该链表结点 它是由四个域组成.name8 、num ll 和 address20 都是 char 浮点型,输入输出都只能 是浮点型的。采用链地址法,其中的所有同义词构成一个单链表,再由一个表头结点指向这个单链表 的第一个结点。这些表头结点组成一个一维数组,即哈
4、希表。数组元素的下标对应由散列函 数求出的散列地址。拉链法处理冲突 的散列表结构: 3、主程序分析本题目最主要的要求是设计散列 函数,本程序需要设计两个散列函数才能解决问题,程序需 要分别为以 电话号码和用户名为关键字建立哈希表 。所以要分别以用户名、号码为关键字建 立两个散列画数,具体思路为 :对于以号码为关键字的散列函数,是将十一个数字全部相加,然后对 20 求余。得到的 数作为地址 。对于以用户名为关键字的散列函 数,是将所有字母的ASCLL 码值相加 ,然后对 20 求余。要添加用户信息,即要有实现添加结点的功能的函数,所以要设计一个必须包括一个输 入结点信息、添加结点的函数:要实现查
5、找函数 ,则必须包括一个查找结点的函数; 另外还有一个必不可少的就是运 行之后要有一个主菜单 ,即要设计一个主函数(main() )。4、测试数据的选择最后,程序完成后要对程序进行 编译调试,执行后要选择数据进行测试,这里选择的测试数 据为:l、姓名:张三 电话号码:13805690141 地址:合肥2、姓名:Jack 电话号码:13500408899 地址:Shanghai三、概要设计和数据结构选择本设计涉及到的数据结构为 :哈希表。要求输入电话号码、用户名、地址三个信息,并 要求分别以电话号码和用户名为关键字进行查找,所以本问题要用到两个晗希函数,进行哈 希查找。在链地址法中,每个结点对应
6、一个链表结点,它由三个域组成,而由于该程序需要分别 用电话号码和用户名为关键字建立哈希表 ,所以该链表结点它是由 四个域组成 ,链地址法结 点结构如图: 阳e8 I 川口J l a抽出s 20 I next其中 name8和 numll 是分别为以电话号码和用户名为关键字域 ,存放关键字 (key ) ; address20(data)为结点的数据域,用来存储用户的地址。Next 指针是用来指 向下一个结点 的地址。主要算法的流程 图如下:以号码为关键字的 Hash()函数流程图开始取整型 num2赋给 keyi从 3 开始取 Key=key+(int) numii+Key=key%20结束以
7、姓名为关键字的 HashO函数流程图开始取整型nameO赋给 key2i从 0 开始取Key2+=nameii+Key2:key%20结束添加结点信息流程图:开始申请新的结点 newphone,newname 即新的号码和名字Newphone=input()Newname 指向 newphone调用 hash()函数调用 hash()函数拉链法处理冲突利用用户名为关键字插入结束按姓名查找流程图:开始调用 hash()函数中新结点 q 指向phonekey-nextq=q-next输 出无 记 录q 不为 空输 出相 应记录结束按号码查找流程图:开始 调用 bash2()函数中新结点 q 指向p
8、bonekey-nextq=q-next输 出无 记 录q 不为空输 出相 应 记录结束初始化散列链表 (1) 并为其动态分配内存空 间初始化散列链表 ( 2) 并为其动态分配内存空 间主程序流程图Menu () 主 菜单进行姓名散1 list2()添加记录 apend()进行号码散列 list()号码散列结果清空 creat();creat2()列表己清空退出系统 return O结束四、详细设计和编码首先定义结点结构体类型,在链地址法 中,每个结点对应一个链表结点,它由三个域组 成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表 ,所以该链表结点它是 由四个域组成 ,链地址法结点
9、结构如图:I n棚e s I 川其中 name8和 num ll是分别为以电话号码和用户名为关键 字域 (key) ,存放关键字: address20为结点的数据域(data),用来存储用户的地址信息。next 指针是用来指向下一个结 点的地址。unsigned int key 和 unsigned int key2 分别被定义为电话号码和用户名关键字。程序的主要模 块如下:串程序部分源代码中串串串串串丰1、建立节点struct node H建节点char name8,address20矿节点中要包含用户名,用户地址,电话号码以及指向下一个结点的指针char num(ll; node * ne
10、xt;typedef node* pnode; /typedef 可以为一个己有的数据类型声明多个别名,这里为该类型声明了两 个指针typedef node* mingzi; node *phone ;node 肺nam; node *a;2、对哈希函数的定义本程序要设计两个 hash O 函数,分别对应电话号码和用户名。本设计中对散列函数 选择的是除留余数法,即对关键字进行模运算,将运算结果所得的余数作为关键字(或 结点 的存储地址,即 H (key) =key mod p,本设计中p 取 20,然后将计算出来的数作为该结 点的地 址赋给 key。具体方法如下:以电话号码为关键字建立哈希函数
11、 hash(char num11) 。以用户 名为关键字建立哈希 函数bash2(char name8) 。利用强制类型转换,将用户名的每一个字母 的ASCLL 码值相加并且除以20 后的余数。将计算出来的数作为该结 点的地址赋给 key2 。程序部分源代码牢牢牢牢牢牢牢牢牢牢串串串串串串串 串本本中a),oid hash(char numll) II以电话号码为关键字建立哈希函数key=(int)num 2;while(numi!=NULL)key+=(int)numi;1+;key=key %20;b)void bash2(char name8) II以用户名为关键字建立晗希函数int i
12、 = 1; key2=(int)nameO;while(namei!=NULL)key2+=(int)namei;;key2=key2%20;然后,建立结点 ,并添加结点 ,利用链地址法解决冲突 。建立结点应包括动态申请内 存空间。向结点中输入信息。同时将结点中的 next 指针等于 null 。添加结点,首先需要利用 晗希函数计算出地址即关键字,其次将该结点插入以关键字为地址的链表后 ,当然由于分别 以用户名和电话号码为关键字 ,所以分两种情况 ,如果以用户名为关键字则调用 void hash2(char name8)函数,并且将结点插入对应的散列链表中,如果以电话号码为关键字则 调用 vo
13、id hash(char numll)函数,并且将结点插入对应的散列链表中 。并且,需要两个建立散列链表的函数 ,分别动态申请一定的空间 ,用于动态申请散列 链表。void creat()用来动态创建以电话号码为关键字的链表数组,void create2()用来动态创 建以用户名为关键字的链表数组。串串程序部分源代码串串丰void create() II新建号码节点phonei=new node; phonei-next=NULL;int i;phone=new pnode20; fl动态创建对象数组for(i=O;inext=NULL ;nam=new mingzi20; for(i=O;i
14、next; while(q!= NULL)if(strcmp(num,q-num)=O) break;q=q-next;if(q)printf(”%s_%s_%sn,q-name,q-addre邸 q-num); else printf ( 无J1t记录飞n);b)、void fmd2(char nameS) II 在以用户名为关键字的哈希表中查找用户信息hash2(name);node *q=namkey2-next; while(q!= NULL)if(strcmp(name,q-name)=O) break;q=q-next;if(q)printf(”%s_%s_%s恼”,q-name,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 设计 实现 复习 进程
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。