哈希表设计数据结构课程设计
- 格式:docx
- 大小:206.00 KB
- 文档页数:17
数据结构的课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握线性表、树、图等常见数据结构的特点与应用场景。
2. 学会分析不同数据结构的存储方式和操作方法,并能运用到实际问题的解决中。
3. 掌握排序和查找算法的基本原理,了解其时间复杂度和空间复杂度。
技能目标:1. 能够运用所学数据结构知识,解决实际问题,提高编程能力。
2. 能够运用排序和查找算法,优化程序性能,提高解决问题的效率。
3. 能够运用数据结构知识,分析并解决复杂问题,培养逻辑思维能力和创新意识。
情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学习热情,形成主动探索和积极进取的学习态度。
2. 增强学生的团队协作意识,培养合作解决问题的能力,提高沟通表达能力。
3. 培养学生的抽象思维能力,使其认识到数据结构在计算机科学中的重要性,激发对计算机科学的热爱。
本课程针对高中年级学生,结合学科特点和教学要求,注重理论与实践相结合,培养学生的编程能力和逻辑思维能力。
通过本课程的学习,使学生能够掌握数据结构的基本知识,提高解决实际问题的能力,同时培养良好的学习态度和价值观。
在教学过程中,将目标分解为具体的学习成果,以便进行后续的教学设计和评估。
二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,重点讲解线性结构(线性表、栈、队列)和非线性结构(树、图)的特点。
2. 线性表:讲解线性表的顺序存储和链式存储结构,以及相关操作(插入、删除、查找等)。
3. 栈和队列:介绍栈和队列的应用场景、存储结构及相关操作。
4. 树和二叉树:讲解树的定义、性质、存储结构,二叉树的遍历算法及线索二叉树。
5. 图:介绍图的定义、存储结构(邻接矩阵和邻接表)、图的遍历算法(深度优先搜索和广度优先搜索)。
6. 排序算法:讲解常见排序算法(冒泡排序、选择排序、插入排序、快速排序等)的原理、实现及性能分析。
7. 查找算法:介绍线性查找、二分查找等查找算法的原理及实现。
数据结构课程设计客户消费积分系统数据结构课程设计 - 客户消费积分系统一、引言在现代商业领域,客户积分系统已经成为了各大企业提高客户忠诚度和促进消费的重要工具之一。
客户消费积分系统通过记录客户的消费行为并赋予相应的积分奖励,可以有效地激励客户继续购买,并提供个性化的优惠和奖励。
为了实现这样的客户消费积分系统,我们需要设计一个高效的数据结构来存储和管理客户的消费和积分信息。
二、系统需求分析1. 客户信息管理:系统需要能够存储和管理客户的基本信息,包括客户ID、姓名、联系方式等。
2. 消费记录管理:系统需要能够记录客户的消费行为,包括消费金额、消费时间等,并根据消费金额计算相应的积分。
3. 积分管理:系统需要能够根据客户的消费行为自动计算和更新客户的积分,并能够查询客户的积分余额。
4. 优惠和奖励管理:系统需要能够根据客户的积分余额和消费历史,自动判断并提供相应的优惠和奖励。
三、系统设计为了满足上述需求,我们可以设计以下数据结构来实现客户消费积分系统。
1. 客户信息数据结构我们可以使用一个包含以下字段的结构体来表示客户信息:- 客户ID:惟一标识客户的ID。
- 姓名:客户的姓名。
- 联系方式:客户的联系方式。
可以使用链表或者数组来存储客户信息,每一个节点或者元素表示一个客户。
2. 消费记录数据结构我们可以使用一个包含以下字段的结构体来表示消费记录:- 客户ID:消费记录所属客户的ID。
- 消费金额:客户的消费金额。
- 消费时间:客户的消费时间。
可以使用链表或者数组来存储消费记录,每一个节点或者元素表示一条消费记录。
3. 积分管理数据结构为了高效地计算和更新客户的积分,我们可以使用哈希表来存储客户的积分信息。
哈希表的键值对可以是客户ID和积分余额。
4. 优惠和奖励管理数据结构为了根据客户的积分余额和消费历史提供优惠和奖励,我们可以使用条件语句和规则引擎来实现。
根据不同的积分范围和消费历史,系统可以自动判断并提供相应的优惠和奖励。
课程设计心得体会“数据结构与算法课程设计”是计算机科学与技术专业学生的集中实践性环节之一,是学习“数据结构与算法”理论和实验课程后进行的一次全面的综合练习。
其目的是要达到理论与实际应用相结合,提高学生组织数据及编写程序的能力,使学生能够根据问题要求和数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并用软件解决问题,培养良好的程序设计技能。
拿到一个题目首先要分析这个程序所需要完成的功能,如本题需要完成电话簿记录的添加、查找、显示和清空四个基本功能。
在此基础上我们再看题目上要求需要用哈希表来进行程序的设计,如何合理的处理地址同义词之间的冲突,我们选择拉链法。
这只是初步思路,在具体编写程序的时候,如何很好的定义结点,结点包括哪些数据,如何合理的处理冲突,哈希地址的计算方法都需要我们进行仔细的思考和斟酌。
从一开始实现数据的添加到之后数据的查找是一步一步摸索的过程,可能我们会有现成的例题可以借鉴,但是开了之后,我们思想的散发性就会受到限制,可能想法不够全面,但是自己想才会有很深的体会。
我在对这个题目进行思考的过程中,如何合理的利用姓名和电话号码这两个关键字进行哈希地址的运算令我想了挺久的,最后借鉴了一种很好的哈希地址求法,将姓名和电话号码从第二开始累加,对30求模得出哈希地址。
之后我觉得比较重要的就是对一个程序完善性的理解,当一个程序的基本框架出来之后,如何去完善它,美化它。
对于一些功能的实现,如出现重复的数据如何查找,如何输出之类的问题,十分重要。
我在这次思考中就没有处理好。
程序完成后,没有想到对重复数据的处理,在查找时,导致了死循环的产生。
再者,比较重要的就是对某一方面知识点的重点掌握和理解,如该实验,你必须对哈希表有着很好的掌握,对各种处理冲突的方法有一定的认识。
在该次实验中,由于对文件方面知识的欠缺,使我没有能够完成文件方面的数据处理,有点小遗憾。
课程设计只有短短的两周时间,但对我们来说,算是一种对动手和思考能力的锻炼,它在一定方面上也提高了我们解决实际问题的能力,要成为一名本专业合格的学生,多进行几次这个类型的活动是十分有意义的。
福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级:xxxxxx班座号:xxxxxxxxxxxx姓名:xxxxxxx2011年12 月31 日实验题目:哈希表一、要解决的问题针对同班同学信息设计一个通讯录,学生信息有姓名,学号,电话号码等。
以学生姓名为关键字设计哈希表,并完成相应的建表和查表程序。
基本要求:姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。
完成按姓名查询的操作。
运行的环境:Microsoft Visual C++ 6.0二、算法基本思想描述设计一个哈希表(哈希表内的元素为自定义的结构体)用来存放待填入的30个人名,人名为中国姓名的汉语拼音形式,用除留余数法构造哈希函数,用线性探查法解决哈希冲突。
建立哈希表并且将其显示出来。
通过要查找的关键字用哈希函数计算出相应的地址来查找人名。
通过循环语句调用数组中保存的数据来显示哈希表。
三、设计1、数据结构的设计和说明(1)结构体的定义typedef struct //记录{NA name;NA xuehao;NA tel;}Record;录入信息结构体的定义,包含姓名,学号,电话号码。
typedef struct //哈希表{Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;哈希表元素的定义,包含数据元素存储基址、数据元素个数、当前容量。
2、关键算法的设计(1)姓名的折叠处理long fold(NA s) //人名的折叠处理{char *p;long sum=0;NA ss;strcpy(ss,s); //复制字符串,不改变原字符串的大小写strupr(ss); //将字符串ss转换为大写形式p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}(2)建立哈希表1、用除留余数法构建哈希函数2、用线性探测再散列法处理冲突int Hash1(NA str) //哈希函数{long n;int m;n=fold(str); //先将用户名进行折叠处理m=n%HASHSIZE; //折叠处理后的数,用除留余数法构造哈希函数return m; //并返回模值}Status collision(int p,int c) //冲突处理函数,采用二次探测再散列法解决冲突{int i,q;i=c/2+1;while(i<HASHSIZE){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0) return q;else i=c/2+1;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) return q;else i=c/2+1;}}return UNSUCCESS;}void benGetTime();}else printf("\n此人不存在,查找不成功!\n");benGetTime();}(4)显示哈希表void ShowInformation(Record* a) //显示输入的用户信息{int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}(5)主函数的设计void main(int argc, char* argv[]){Record a[MAXSIZE];int c,flag=1,i=0;HashTable *H;H=(HashTable*)malloc(LEN);for(i=0;i<HASHSIZE;i++){H->elem[i]=NULL;H->size=HASHSIZE;H->count=0;}while (1){ int num;printf("\n ");printf("\n 欢迎使用同学通讯录录入查找系统");printf("\n 哈希表的设计与实现");printf("\n 【1】. 添加用户信息");printf("\n 【2】. 读取所有用户信息");printf("\n 【3】. 以姓名建立哈希表(再哈希法解决冲突) ");printf("\n 【4】. 以电话号码建立哈希表(再哈希法解决冲突) ");printf("\n 【5】. 查找并显示给定用户名的记录");printf("\n 【6】. 查找并显示给定电话号码的记录");printf("\n 【7】. 清屏");printf("\n 【8】. 保存");printf("\n 【9】. 退出程序");printf("\n 温馨提示:");printf("\n Ⅰ.进行5操作前请先输出3 ");printf("\n Ⅱ.进行6操作前请先输出4 ");printf("\n");printf("请输入一个任务选项>>>");printf("\n");scanf("%d",&num);switch(num){case 1:getin(a);break;case 2:ShowInformation(a);break;case 3:CreateHash1(H,a); /* 以姓名建立哈希表*/break;case 4:CreateHash2(H,a); /* 以电话号码建立哈希表*/break;case 5:c=0;SearchHash1(H,c);break;case 6:c=0;SearchHash2(H,c);break;case 7:Cls(a);break;case 8:Save();break;case 9:return 0;break;default:printf("你输错了,请重新输入!");printf("\n");}}system("pause");return 0;3、模块结构图及各模块的功能:四、源程序清单:#include<stdio.h>#include<stdlib.h>#include<string.h>#include <windows.h>#define MAXSIZE 20 #define MAX_SIZE 20 #define HASHSIZE 53 #define SUCCESS 1#define UNSUCCESS -1#define LEN sizeof(HashTable)typedef int Status;typedef char NA[MAX_SIZE];typedef struct {NA name;NA xuehao;NA tel;}Record;typedef struct {Record *elem[HASHSIZE]; int count; int size; }HashTable;Status eq(NA x,NA y) {if(strcmp(x,y)==0)return SUCCESS;else return UNSUCCESS;}Status NUM_BER;void getin(Record* a) {int i;system("cls");printf("输入要添加的个数:\n");scanf("%d",&NUM_BER);for(i=0;i<NUM_BER;i++){printf("请输入第%d个记录的姓名:\n",i+1);scanf("%s",a[i].name);printf("请输入%d个记录的学号:\n",i+1);scanf("%s",a[i].xuehao);printf("请输入第%d个记录的电话号码:\n",i+1);scanf("%s",a[i].tel);}}void ShowInformation(Record* a){int i;system("cls");for( i=0;i<NUM_BER;i++)printf("\n第%d个用户信息:\n 姓名:%s\n 学号:%s\n 电话号码:%s\n",i+1,a[i].name,a[i].xuehao,a[i].tel);}void Cls(Record* a){printf("*");system("cls");}long fold(NA s){char *p;long sum=0;NA ss;strcpy(ss,s);strupr(ss);p=ss;while(*p!='\0')sum+=*p++;printf("\nsum====================%d",sum);return sum;}int Hash1(NA str){int m;n=fold(str);m=n%HASHSIZE;return m;}int Hash2(NA str){long n;int m;n = atoi(str);m=n%HASHSIZE;return m;}Status collision(int p,int c){int i,q;i=c/2+1;while(i<HASHSIZE){if(c%2==0){c++;q=(p+i*i)%HASHSIZE;if(q>=0) return q;else i=c/2+1;}else{q=(p-i*i)%HASHSIZE;c++;if(q>=0) return q;else i=c/2+1;}}return UNSUCCESS;}void benGetTime();void CreateHash1(HashTable* H,Record* a){ int i,p=-1,c,pp;system("cls"); benGetTime();for(i=0;i<NUM_BER;i++){p=Hash1(a[i].name);pp=p;while(H->elem[pp]!=NULL) {pp=collision(p,c);if(pp<0){printf("第%d记录无法解决冲突",i+1);continue;}}H->elem[pp]=&(a[i]);H->count++;printf("第%d个记录冲突次数为%d。
数据结构课设数据结构是计算机科学中非常重要的一门课程,它研究各种数据的组织方式和处理方法。
在数据结构课中,学生通常需要完成一个课程设计,以巩固所学知识并增强实践能力。
本文将介绍数据结构课设的一般要求和常见的设计方案。
一、课设要求1. 问题定义:课设通常会给出一个具体的问题或需求,要求学生使用数据结构的知识和算法来解决。
2. 设计思路:学生需要提供一个清晰的设计思路,包括问题的分析、解决方案的选择、数据结构的设计和算法的实现等。
3. 数据结构的选择:学生需要根据问题的性质和要求选择合适的数据结构,如数组、链表、栈、队列、树等。
4. 算法的实现:学生需要实现相应的算法来解决问题,包括数据的插入、删除、查找等操作。
5. 性能分析:学生需要对设计的数据结构和算法进行性能分析,评估其时间复杂度和空间复杂度,并根据分析结果进行优化。
6. 测试与验证:学生需要设计充分的测试用例来验证程序的正确性和性能,确保解决方案的可行性和有效性。
二、设计方案1. 数组:数组是一种线性数据结构,可用于存储一组相同类型的数据。
在课设中,可以使用数组来实现各种结构和算法,如栈、队列、图等。
2. 链表:链表是一种动态数据结构,可用于解决插入和删除操作频繁的问题。
课设中的链表设计可以包括单链表、双链表、循环链表等。
3. 栈和队列:栈和队列是两种常用的数据结构,栈是一种后进先出(LIFO)的数据结构,队列是一种先进先出(FIFO)的数据结构。
可以利用栈和队列解决许多实际问题。
4. 树:树是一种非线性数据结构,具有分层和层次结构。
可以使用二叉树、红黑树、AVL树等来解决与树相关的问题,如查找、排序、遍历等。
5. 图:图是一种复杂的数据结构,用于表示各种实际问题中的关系和连接。
可以使用邻接矩阵或邻接表来表示图,并利用图的各种算法解决相关问题。
6. 其他数据结构:除了上述常见的数据结构,还有许多其他数据结构可以应用于数据结构课设,如哈希表、堆、并查集等。
信息工程学院14级计科、软件工程专业数据结构课程设计计划设计名称《数据结构》课程设计专业、班级计科1401-1403,软件1401-1402 课程性质必修设计周数1周课程学期学时数64学时学期学分4分指导教师签字系主任审核签字一.课程设计的目的通过课程设计的综合训练,旨在帮助学生进一步系统的掌握数据结构这门课的主要内容,并进一步培养学生分析问题和解决问题的能力,主要体现在能够让学生针对实际问题有效地组织数据,选择合适的数据结构,并进行正确和高效的算法设计,并用程序实现算法。
该课的课程设计是一个良好的程序设计技能训练的过程使学生能够:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工程专业学生所应具备的科学的工作方法和作风。
二.课程设计安排三.课程设计内容1.设计题目题目1:运动会分数统计【问题描述】参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)。
【基本要求】(1) 可以输入各个项目的前三名或前五名的成绩;(2) 能统计各学校总分;(3) 可以按学校编号或名称、学校总分、男女团体总分排序输出;(4) 可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校;(5) 学生自己根据系统功能要求自己设计存储结构,但是要求运动会的相关数据要存储在数据文件中并能随时查询;(6) 输入数据形式和范围:可以输入学校的名称,运动项目的名称;(7) 使用汉字显示。
数据结构课程设计实例100例1. 设计一个简单的栈数据结构。
2. 实现一个简单的队列数据结构。
3. 设计一个链表数据结构。
4. 实现一个二叉树数据结构。
5. 设计一个哈希表数据结构。
6. 实现一个图数据结构。
7. 设计一个堆数据结构。
8. 实现一个优先队列数据结构。
9. 设计一个有向图数据结构。
10. 实现一个循环链表数据结构。
11. 设计一个红黑树数据结构。
12. 实现一个字典数据结构。
13. 设计一个AVL树数据结构。
14. 实现一个散列表数据结构。
15. 设计一个双端队列数据结构。
16. 实现一个字典树数据结构。
17. 设计一个多叉树数据结构。
18. 实现一个最小生成树算法。
19. 设计一个并查集数据结构。
20. 实现一个图的遍历算法。
21. 设计一个迪杰斯特拉算法。
22. 实现一个Floyd算法。
23. 设计一个拓扑排序算法。
24. 实现一个最短路径算法。
25. 设计一个Kruskal算法。
26. 实现一个插入排序算法。
27. 设计一个快速排序算法。
28. 实现一个希尔排序算法。
29. 设计一个选择排序算法。
30. 实现一个冒泡排序算法。
31. 设计一个堆排序算法。
32. 实现一个归并排序算法。
33. 设计一个桶排序算法。
34. 实现一个基数排序算法。
35. 设计一个计数排序算法。
36. 实现一个递归算法。
37. 设计一个动态规划算法。
38. 实现一个回溯算法。
39. 设计一个哈夫曼编码算法。
40. 实现一个最大子序列和算法。
41. 设计一个最长递增子序列算法。
42. 实现一个最长公共子序列算法。
43. 设计一个贪婪算法。
44. 实现一个深度优先搜索算法。
45. 设计一个广度优先搜索算法。
46. 实现一个信号量算法。
47. 设计一个分治算法。
48. 实现一个枚举算法。
49. 设计一个置换算法。
50. 实现一个位运算算法。
51. 设计一个红黑树插入算法。
52. 实现一个二进制查找算法。
53. 设计一个最小堆插入算法。
《数据结构》教学大纲一、课程简介《数据结构》是计算机科学与技术相关专业的基础课程之一。
本课程旨在通过理论与实践相结合的方式,培养学生具备良好的数据结构基础、灵活运用和设计数据结构的能力,并通过算法分析、问题求解等方式培养学生的编程思维和创新能力。
二、教学目标1. 理解数据结构的基本概念和原理,包括栈、队列、链表、树、图等基本数据结构的应用场景与实现。
2. 掌握数据结构的基本算法与操作,包括插入、删除、查找、排序等常用操作的实现与分析。
3. 培养学生良好的编程实践能力,能够灵活运用不同的数据结构解决实际问题。
4. 培养学生团队合作精神和沟通能力,能够与他人合作设计和实现复杂的数据结构与算法。
三、教学内容1. 数据结构基础1.1 数据结构与算法的关系1.2 抽象数据类型与数据结构1.3 算法复杂度与评估方法2. 线性结构2.1 线性表的基本概念与实现2.2 栈与队列的定义与应用2.3 数组与链表的对比与选择3. 树形结构3.1 树的基本概念与性质3.2 二叉树的存储与遍历3.3 二叉搜索树与平衡树的应用4. 图结构4.1 图的基本概念与表示方法4.2 图的遍历与连通性算法4.3 最短路径与最小生成树算法5. 排序与查找5.1 常用排序算法的实现与性能分析 5.2 二分查找算法与应用5.3 哈希表的概念与应用四、教学方法1. 理论讲解:通过授课方式向学生讲解数据结构的基本概念、原理和算法分析方法。
2. 实验实践:通过编写程序实践,巩固和加深学生对数据结构的理解与应用能力。
3. 课堂讨论:鼓励学生在课堂上提问和讨论问题,促进学生思维的活跃和沟通能力的培养。
4. 课程设计:结合实际案例,进行小组项目设计,培养学生团队合作和创新能力。
五、教学评价与考核1. 平时成绩:包括课堂讨论与实验成绩,在课堂上主动提问、积极参与实验的学生将获得较高成绩。
2. 作业与报告:包括编程作业、实验报告等,学生需要按时完成,并按要求展示实现结果与思路。
数据结构教学设计教案教学设计教案:数据结构一、教学目标本教学设计旨在匡助学生掌握数据结构的基本概念、常用数据结构的特点和应用,培养学生的抽象思维能力和问题解决能力,提高学生的编程能力和算法设计能力。
二、教学内容1. 数据结构的基本概念- 数据结构的定义和分类- 数据结构的基本操作和特性- 数据结构的存储方式和表示方法2. 常用数据结构- 线性结构:数组、链表、栈、队列- 树形结构:二叉树、堆、哈夫曼树- 图形结构:图、邻接矩阵、邻接表3. 数据结构的应用- 查找算法:顺序查找、二分查找、哈希查找- 排序算法:冒泡排序、插入排序、快速排序- 图算法:最短路径、最小生成树三、教学方法1. 讲授法:通过教师讲解的方式,介绍数据结构的基本概念、常用数据结构和应用。
2. 实例演示法:通过实际案例演示,展示数据结构的操作和应用。
3. 问题解决法:引导学生通过解决问题的方式,巩固和应用所学的数据结构知识。
四、教学步骤1. 导入环节- 引入数据结构的概念,让学生了解数据结构在计算机科学中的重要性和应用场景。
- 激发学生的学习兴趣,提出问题引起思量,如“如何高效地查找一个元素?”、“如何对一组数据进行排序?”等。
2. 知识讲解- 介绍数据结构的基本概念,包括定义、分类和基本操作。
- 详细讲解线性结构、树形结构和图形结构的特点和应用。
- 介绍常用的查找算法、排序算法和图算法的原理和实现方法。
3. 实例演示- 通过具体案例演示,展示线性结构、树形结构和图形结构的操作和应用。
- 演示不同查找算法、排序算法和图算法的实际应用场景和效果。
4. 问题解决- 提供一些问题,让学生运用所学的数据结构知识进行解答。
- 引导学生思量如何选择合适的数据结构和算法,解决实际问题。
5. 总结与拓展- 总结本节课所学的数据结构知识和应用。
- 引导学生思量数据结构的发展趋势和未来应用前景。
五、教学评价1. 学生作业:布置相关作业,要求学生编写代码实现某些数据结构和算法,并进行测试和分析。
合肥学院计算机科学与技术系课程设计报告2007~2008学年第2学期课程数据结构与算法课程设计名称哈希表的设计与实现学生姓名学号0604011026专业班级06 计科 (1)指导教师2008年9月一、课程设计题目:(哈希表的设计与实现的问题)设计哈希表实现电话号码查询系统。
设计程序完成以下要求:( 1)设每个记录有下列数据项:电话号码、用户名、地址;(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;( 3)采用再哈希法解决冲突;(4)查找并显示给定电话号码的记录;(5)查找并显示给定用户的记录。
二、问题分析和任务定义1、问题分析要完成如下要求:设计哈希表实现电话号码查询系统。
实现本程序需要解决以下几个问题:(1)如何设计一个结点使该结点包括电话号码、用户名、地址。
(2)如何分别以电话号码和用户名为关键字建立哈希表。
(3)如何利用再哈希法解决冲突。
(4)如何实现用哈希法查找并显示给定电话号码的记录。
(5)如何查找并显示给定用户的记录。
2、任务定义由问题分析知,本设计主要要求分别以电话号码和用户名为关键字建立哈希表,并实现查找功能。
所以本设计的核心问题是如何解决散列的问题,亦即设计一个良好的哈希表。
由于结点的个数无法确认,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。
所以采用链地址法散列算法。
采用链地址法,当出现同义词冲突时,使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。
首先,解决的是定义链表结点,在链地址法中,每个结点对应一个链表结点,它由三个域组成,而由于该程序需要分别用电话号码和用户名为关键字建立哈希表,所以该链表结点它是由四个域组成.name[8]、num[11]和address[20]都是char浮点型,输入输出都只能是浮点型的。
采用链地址法,其中的所有同义词构成一个单链表,再由一个表头结点指向这个单链表的第一个结点。
这些表头结点组成一个一维数组,即哈希表。
哈希表设计数据结构课程设计
实习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";。