数据结构设计报告

上传人:s****a 文档编号:166195070 上传时间:2022-10-31 格式:DOCX 页数:10 大小:60.50KB
返回 下载 相关 举报
数据结构设计报告_第1页
第1页 / 共10页
数据结构设计报告_第2页
第2页 / 共10页
数据结构设计报告_第3页
第3页 / 共10页
点击查看更多>>
资源描述
数据结构课程设计报告书班级 BX1001 专业计算机科学与技术学号 101003020139姓名 赵冠博课题描述:哈希表的查找与实现分析1、需求分析:本次课程设计需要实现哈希表的建立和查找,具体内容如下:建立哈希函数,从而根据用户输入的数据元素个数和各元素的值建立哈希 表,即数据的添加和存储。如果输入的元素个数超出规定范围,则打印出错信 息,并提示重新输入信息。哈希表建立好之后,用户可以输入想要查找的值,屏幕显示相应信息。如 果存在此值,屏幕显示该值信息;如果不存在,则显示该值不存在;如果想退 出系统,则按提示输入命令。2、总体结构设计:1 一个哈希表结构hashtable,2个main ()主函数(完成数据输入和函数调用)、3五个功能函数:Initialhash()初始化哈希表Printhash()输出哈希表的所有元素及其位置Searchhash ()查找哈希表inserthash ()查找哈希表deletehash ()/查找哈希表3、各子模块设计:构成如下图所示:【设计思想】选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;查 找时,由同一个函数对给定值kx计算地址,将kx与地址单元中元素关键字进行 比较,确定查找是否成功,这就是哈希方法。哈希方法中使用的转换函数称为哈希函数。程序首先通过插入操作建立哈希表,接着显示数据,然后运用哈希 查找找到数据,如没有找到则显示查找错误,找到则显示查找成功。4、编程实现:【实验程序主要代码】:/哈希表的最大容量,与所采用的哈希函数有关#define MAXSIZE 12 enum B00LFalse,True; enum HAVEORNOTNULLKEY,HAVEKEY,DELKEY;/哈希表元素的三种状态,没有记录、有记录、有过记录但已被删除 typedef st ruct/定义哈希表的结构 int elemMAXSIZE;/数据元素体HashTable;typedef struct int keynum;/记录的数据域,只有关键字一项Record;void InitialHash(HashTable&);/初始化哈希表void PrintHash(HashTable);/显示哈希表中的所有元素BOOL SearchHash(HashTable,i nt,int&);/在哈希表中查找元素BOOL InsertHash(HashTable&,Record);/在哈希表中插入元素BOOL DeleteHash(HashTable&,Record);/在哈希表中删除元素int Hash(int);/哈希函数void main() HashTable H;/声明哈希表H/哈希表中当前元素的个数char ch,j二,y,; int posi tion ,n,k; Record R;BOOL temp;InitialHash(H); while(j!二n)printf(nt哈希查找)printf(nt*)printf(nt*1建表*)printf (nt*2显示*)printf (nt*3查找*)printf (nt*4插入*)printf(nt*5删除*)printf(nt*0退出*)printf(nt*)HAVEORNOT elemflagMAXSIZE;/元素状态,没有记录、有记录、有过记录但已被删除 int count;printf(nnt请输入菜单号:);scanf( %c, &ch);/输入操作选项switch(ch) case l:prin tf (n 请输入元素个数(10):);scanf(%d,&n);printf(n);for( k=0;kn;k+) printf(请输入第%3d个整数:,k+1);scanf(%d, &R.keynum); /输入要插入的记录t emp=Inser tHash(H,R);;break;case 2: if (H.count) PrintHash(H);/ 哈希表不空else prin tf (n 散列表为空表!n); break;case 3:if(!H.count) printf(n散列表为空表!n);/ 哈希表空else prin tf(n请你输入要查找元素(in t):); scanf(%d, &R.keynum);/输入待查记录的关键字t emp=SearchHash(H,R.keynum,posi tion);/ temp二True:记录查找成功;temp二False:没有找到待查记录 辻(t emp) prin tf (n查找成功该元素位置是%dn,posi tion); else prin tf(n本散列表没有该元素!n);break;case 4:if(H.count=MAXSIZE)/ 哈希表已满 printf (n散列表已经满!n);break; prin tf (n请输入要插入元素(in t):);scanf(%d, &R.keynum);/输入要插入的记录t emp=Inser tHash(H,R);/ temp=True:记录插入成功;temp二False:已存在关键字相同的记录 if( temp) prin tf (n 元素插入成功!n);else prin tf(n元素插入失败,相同元素本散列表已经存在!n); break;case 5:printf(n请你输入 要删除元素(int):);scanf(%d, &R.keynum);/输入要删除记录的关键字t emp二Dele teHash(H,R);/ temp=True:记录删除成功;temp=False:待删记录不存在 if( temp) prin tf(n 删除成功!n);else prin tf(n删除元素不在散列表中!n); break;defau lt: j=n;printf(nt欢迎再次使用本程序,再见!n);void InitialHash(HashTable &H) / 哈希表初始化 int i;H.cou nt=0;for(i=0;iMAXSIZE;i+) H.elemflagi=NULLKEY;void PrintHash(HashTable H) /显示哈希表所有元素及其所在位置 int i;for(i=0;iMAXSIZE;i+) printf(%-4d,i);/ 显示哈希表中记录所在位置printf(n);for(i=0;iMAXSIZE;i+)/显示哈希表中记录值if(H.elemflagi=HAVEKEY) pri ntf (%-4d,H.elemi);elseprintf(%4c,);printf(ncount:%dn,H.count);/ 显示哈希表当前记录数BOOL SearchHash(HashTable H,int k,int &p) /在开放定址哈希表H中查找关键字为k的数据元素,若查找成功,以p指示待查/数据元素在表中的位置,并返回True;否则,以p指示插入位置,并返回False int p1;p1=p=Hash(k);/求得哈希地址while(H.elemflagp=HAVEKEY&k!=H.elemp) /该位置填有记录并且关键字不相等 p+;/冲突处理方法:线性探测再散列if(p=MAXSIZE) p=p%MAXSIZE;/ 循环搜索if(p=p1) re turn False;/整个表已搜索完,没有找到待查元素if(k=H.elemp &H.elemflagp=HAVEKEY)/ 查找成功,p 指示待查元素位置return True;else re turn False;/ 查找不成功BOOL InsertHash(HashTable &H,Record e) /查找不成功时插入元素e到开放定址哈希表H中,并返回True,否则返回Falseint p;if(SearchHash(H,e.keynum,p)/表中已有与e有相同关键字的元素return False;else H.elemflagp=HAVEKEY;/设置标志为HAVEKEY,表示该位置已有记录H.elemp=e.keynum;/ 插入记录H.count+;/哈希表当前长度加一return True;BOOL DeleteHash(HashTable &H,Record e) /在查找成功时删除待删元素e,并返回True,否则返回Falseint p;if(!SearchHash(H,e.keynum,p) else H.elemflagp=DELKEY;H.count;return True;int Hash(int kn) return (kn%ll); return False;/表中不存在待删元素/设置标志为DELKEY,表明该元素已被删除/哈希表当前长度减一/ 哈希函数:H(key)=key MOD 115、测试结果:【程序运行结果】建表和显示:-|口| Xg我的工作文件、教案与课件、数据结构本人电子教案10计算机实崟Debug实鑿9 :哈希查找哈希查找表示找入留 建显杳一插删退 - -1 2 3 4 5 0请输入菜单号:1请输入元素个数10= ?入入入入入入入入入 主闻主星垦闻主星垦闻主闻主阳1个整数2个整数3个整数4个整数 E个整数6个整数 ?个整数8个整数9个整数233616284087496062表示找入留 建显查插删退 - -1 2 3 4 5 0请输人菜单号:201234567891011233616284049608762GQLint : 9查找:我的工作左件教案与课件数齬结构、本人电子教案X0计算机实SDebue实鑿9 :哙希查找 国回哈希查找表示找入富 建显查插删退 - -1 2 3 4 5 0请输入菜单号:3请你输入要查找元素 :28 查找成功该元素位置是6哈希查找表示找入雷 建显查插删退请输入菜单号:3 请你输入要查找元素 :2? 本散列表没有该元素?插入:7777-1 I - .T . T鮮Pl.寒:11bit ):38看斷?.薫車门4请输人菜单号,20123-35671111& Z33bZB 4U 4!# 阳 87 强 UHlUt : 1 MZi=rK轉盖舄M7W亠:n找F示费留- 一 - 8 建並*a11退一 二一 一 一 一 一 一= 二-Z 二-一 P 一 c i i i i i - “ 二一 一一 一 i 】 1 s- 1 4- 5 BK K M * * *汁乂亡用比辽-删除:的工作立件、教案与课件数据结构本人电子教案10计算机、实feDebe实鑿9 :喑希查找-|n|x|表示找入靑 建显查插删退 - -1 2 3 4 5 0请输入菜单号:5请你输入 要删除元素int:49删除成功!哈希查找表示找入留建显查插删退-1 2 3 4 5 0请输入菜单号:201234567891011302336162840608762count: 9通过分析输入数据和运行结果,证明程序顺利完成实验内容和要求。6、总结:通过这个星期的课程设计,我的收获还是不少。我的c语言水平有了比较 大的提高,其中c语言关于指针,链表的操作理解的比以前深刻不少。另外是 数据结构方面的提咼,对存储结构,及各种查找排序方面也有不少的提咼。虽 然我做的程序里还有写问题,做的不够深入,但独立完成一个比较大一点的程 序的经历也是很宝贵的。通过这次做课程设计,使我对数据结构这门课的认识更进一步,这门课确 实是学好计算机程序设计的基础。与此同时,自己对程序设计中应该注意的一 些问题也有了自己的一些想法。首先,一个程序要达到正确性,可读性,健壮 性,高效率和低存储量的要求,这样用户在使用程序的时候才会更加满意,程 序才能得到更多的关注。其次,要养成良好的编程习惯,在做一个程序之前, 要对该程序的存储结构,抽象数据类型和应该具备的功能以及各模块之间的调 用关系有一个总体的把握,画出必要的算法流程图或写出必要的伪码来表示各 模块应该具备的功能。再次,在编写程序的过程中应该对一些难于理解的地方 加上必要的注释,这样会使在之后的调试与维护阶段更加容易,在定义功能函 数与变量时应该尽量采取有表征意义的名称,这样也可达到见名知意的效果。 最后,在程序的调试阶段,应该针对程序中用户可能进行的错误操作给出解决 的方法,要尽量选出几组具有毁灭性的数据来进行测试,在程序不能正常处理 的情况下要采取一些方案使这样的问题得以解决。做程序是一个比较累的工 作,特别是当遇到困难时,程序通不过时,真的很令人沮丧。但是改正一个错 误时,那种喜悦心情也很令人期盼,这种心情堪比久旱见甘霖的喜悦。就是因 为有这种令人身心愉悦的可能,我才得以能够整晚不睡来改程序中的不足之 处。编程中有苦有乐,其中的苦乐只有亲身经历才能体会到。要想做出好的程 序,必须做好忍受其间痛苦的准备。7、参考文献。1 严蔚敏,吴伟民.数据结构,清华大学出版社,2001年1月2 刘怀亮.数据结构习题解析与实验指导,冶金工业出版社,2005 年2月3谭浩强.数据结构,清华大学出版社,1999年12月
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!