哈希表设计数据结构优秀课程设计.docx
《哈希表设计数据结构优秀课程设计.docx》由会员分享,可在线阅读,更多相关《哈希表设计数据结构优秀课程设计.docx(10页珍藏版)》请在咨信网上搜索。
实习6、哈希表设计 一、 需求分析 1. 问题描述 针对某个集体(比如你所在班级)中“人名”设计一个哈希表,使得平均查找长度均不超出R,完成对应建表和查表次序。 2. 基础要求 假设人名为中国人姓名汉语拼音形式。待填入哈希表人名共有30个,取平均查找长度上限为2。哈希函数用除留余数法结构,用伪随机探测再散列法处理冲突。 3. 测试数据 取读者周围较熟悉30个人姓名。 4. 实现提醒 假如随机数自行结构,则应首先调整好随机函数,使其分布均匀。人名长度均不超出19个字符(最长人名如:庄双双(Zhuang Shuangshuang))。字符取码方法可直接利用C语言中toascii函数,并可先对过长人名先作折叠处理。 二、概要设计 ADT Hash { 数据对象D:D是含有相同特征数据元素集合。各数据元素均含有类型相同,可唯一标识数据元素关键字。 数据关系R:数据元素同属一个集合。 InitNameTable() 操作结果:初始化姓名表。 CreateHashTable() 操作结果:建立哈希表。 DisplayNameTable() 操作结果:显示姓名表。 DisplayHashTable() 操作结果:显示哈希表。 FindName() 操作结果:查找姓名。 }ADT Hash 三、具体设计(源代码) (使用C语言) #include<stdio.h> #include<time.h>//time用到头文件 #include<stdlib.h>//随机数用到头文件 #include<ctype.h>//toascii()用到头文件 #include<string.h>//查找姓名时比较用头文件 #define HASH_LEN 50//哈希表长度 #define P 47//小于哈希表长度P #define NAME_LEN 30//姓名表长度 typedef struct {//姓名表 char *py; //名字拼音 int m; //拼音所对应 }NAME; NAME NameTable[HASH_LEN]; //全局定义姓名表 typedef struct {//哈希表 char *py; //名字拼音 int m; //拼音所对应ASCII总和 int si; //查找长度 }HASH; HASH HashTable[HASH_LEN]; //全局定义哈希表 int d[30],i,j; //全局定义随机数,循环用i、j void InitNameTable() {//姓名表初始化 NameTable[0].py="caowukui"; NameTable[1].py="langzhijie"; NameTable[2].py="dongshuliang"; NameTable[3].py="qiuhouyang"; NameTable[4].py="zhangxu"; NameTable[5].py="duhuan"; NameTable[6].py="fanqing"; NameTable[7].py="songxiaofei"; NameTable[8].py="dutongtong"; NameTable[9].py="sunhaohao"; NameTable[10].py="shanjianfeng"; NameTable[11].py="wangbaoshan"; NameTable[12].py="houfeng"; NameTable[13].py="hujiaming"; NameTable[14].py="jiangkaiqiang"; NameTable[15].py="xuyang"; NameTable[16].py="lvdelu"; NameTable[17].py="shenjinfeng"; NameTable[18].py="xuhui"; NameTable[19].py="hanle"; NameTable[20].py="xunwenwen"; NameTable[21].py="chenhongcong"; NameTable[22].py="zhangyanyan"; NameTable[23].py="nieyanshun"; NameTable[24].py="haopengcheng"; NameTable[25].py="yuhaiyuan"; NameTable[26].py="shuxiang"; NameTable[27].py="sunyingjie"; NameTable[28].py="wangbo"; NameTable[29].py="zhaoqing"; NameTable[30].py="zhangshengqian"; for (i=0;i<NAME_LEN;i++) //将字符串各个字符所对应ASCII码相加,所得整数做为哈希表关键字 { int s=0; char *p=NameTable[i].py; for (j=0;*(p+j)!='\0';j++) s+=toascii(*(p+j)); NameTable[i].m=s; } } void CreateHashTable() {//建立哈希表 for(i=0;i<HASH_LEN;i++) { HashTable[i].py="\0"; HashTable[i].m =0; HashTable[i].si=0; } for(i=0;i<NAME_LEN;i++) { int sum=1,j=0; int adr=(NameTable[i].m)%P; //除留余数法 H(key)=key MOD p,p<=m if(HashTable[adr].si==0) //假如不冲突,将姓名表赋值给哈希表 { HashTable[adr].m =NameTable[i].m; HashTable[adr].py=NameTable[i].py; HashTable[adr].si=1; } else //假如冲突 { while(HashTable[adr].si!=0) { adr=(adr+d[j++])%HASH_LEN; //伪随机探测再散列法处理冲突 sum=sum+1; //查找次数加1 } HashTable[adr].m =NameTable[i].m; //将姓名表复制给哈希表对应位置上 HashTable[adr].py=NameTable[i].py; HashTable[adr].si=sum; } } } void DisplayNameTable() {//显示姓名表 printf("\n地址 \t\t 姓名 \t\t 关键字\n"); for (i=0;i<NAME_LEN;i++) printf("%2d %18s \t\t %d \n",i,NameTable[i].py,NameTable[i].m); } void DisplayHashTable() {// 显示哈希表 float asl=0.0; printf("\n\n 地址 \t\t 姓名 \t\t 关键字 \t 搜索长度\n"); //显示格式 for (i=0;i<HASH_LEN;i++) { printf("%2d %18s \t\t %d \t\t %d\n",i,HashTable[i].py,HashTable[i].m,HashTable[i].si); asl+=HashTable[i].si; } asl/=NAME_LEN;//求得ASL printf("\n\n平均查找长度:ASL(%d)=%f \n",NAME_LEN,asl); } void FindName() {//查找 char name[20]={0}; int s=0,sum=1,adr; printf("\n请输入想要查找姓名拼音:"); scanf("%s",name); getchar(); for (j=0;j<20;j++)//求出姓名拼音所对应ASCII作为关键字 s+=toascii(name[j]); adr=s%P; //除留余数法 j=0; if(HashTable[adr].m==s&&!strcmp(HashTable[adr].py,name)) //分3种情况进行判定,并输出超找结果 printf("\n姓名:%s 关键字:%d 查找长度为: 1\n",HashTable[adr].py,s); else if (HashTable[adr].m==0) printf("没有想要查找人!\n"); else { while(1) { adr=(adr+d[j++])%HASH_LEN;//伪随机探测再散列法处理冲突 sum=sum+1; //查找次数加1 if(HashTable[adr].m==0) { printf("没有想要查找人!\n"); break; } if(HashTable[adr].m==s&&!strcmp(HashTable[adr].py,name)) { printf("\n姓名:%s 关键字:%d 查找长度为:%d\n",HashTable[adr].py,s,sum); break; } } } } int main() {//主函数 char c; int a=1; srand((int)time(0)); for(i=0;i<30;i++)//用随机函数求得伪随机数列d[i](在1到50之间) d[i]=1+(int)(HASH_LEN*rand()/(RAND_MAX+1.0)); InitNameTable(); CreateHashTable(); printf("*******************************************************\n"); printf("* *\n"); printf("* 哈希表设计 *\n"); printf("* *\n"); printf("* A: 显示姓名表 B: 显示哈希表 *\n"); printf("* *\n"); printf("* C: 查找 D: 退出 *\n"); printf("* *\n"); printf("*******************************************************\n"); while(a) { printf("\n请选择:"); scanf("%c",&c); getchar(); switch(c)//依据选择进行判定,直到选择退出时才能够退出 { case 'A': case 'a': DisplayNameTable(); break; case 'B': case 'b': DisplayHashTable(); break; case 'C': case 'c': FindName(); break; case 'D': case 'd': a=0; break; default: printf("\n请输入正确选择!\n"); break; } } return 0; } 四、调试分析 编译环境为CodeBlocks。- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈希表 设计 数据结构 优秀 课程设计
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【w****g】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【w****g】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文