哈希表--数据结构课设

合集下载

散列表数据结构课程设计

散列表数据结构课程设计

散列表数据结构课程设计一、课程目标知识目标:1. 理解散列表(哈希表)的基本概念,掌握其数据结构特点及实现原理;2. 学会使用散列表解决实际问题,如查找、插入和删除等操作;3. 掌握解决散列表冲突的方法,如线性探测、二次探测和链地址法等;4. 了解散列表在不同编程语言中的应用和实现。

技能目标:1. 能够运用散列表实现高效的数据存储和检索,提高编程解决问题的能力;2. 学会分析散列表的性能特点,如时间复杂度和空间复杂度,并进行优化;3. 能够运用散列表解决实际问题,培养编程思维和解决问题的能力;4. 掌握调试和优化散列表程序的方法,提高程序质量和效率。

情感态度价值观目标:1. 培养学生对数据结构与算法的兴趣,激发学习热情,形成主动探究的学习习惯;2. 培养学生的团队合作意识,学会在团队中分工协作,共同解决问题;3. 增强学生的创新意识,鼓励尝试不同的解决方案,提高解决问题的灵活性;4. 培养学生严谨、踏实的科学态度,注重算法的实际应用和优化。

本课程针对高年级学生,结合学科特点和教学要求,注重理论与实践相结合,通过散列表数据结构的学习,提高学生的编程能力和解决问题的能力,培养学生良好的学习态度和团队合作精神。

课程目标具体、可衡量,便于后续教学设计和评估。

二、教学内容1. 散列表基本概念:介绍散列表的定义、作用及其在数据结构中的地位;- 教材章节:第XX章XX节;- 内容:散列表的定义、散列函数、散列值、冲突和解决方法。

2. 散列表的实现原理:- 教材章节:第XX章XX节;- 内容:线性探测法、二次探测法、链地址法等散列表实现方式及其优缺点。

3. 散列表的操作:- 教材章节:第XX章XX节;- 内容:散列表的查找、插入和删除操作及其时间复杂度分析。

4. 散列表性能分析:- 教材章节:第XX章XX节;- 内容:时间复杂度、空间复杂度、装填因子及其对性能的影响。

5. 散列表应用实例:- 教材章节:第XX章XX节;- 内容:实际应用场景、编程实现、性能评估与优化。

大数据结构课程设计--哈希表实验报告材料

大数据结构课程设计--哈希表实验报告材料

福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级: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();void CreateHash1(HashTable* H,Record* a) //建表,以人的姓名为关键字,建立相应的散列表{ int i,p=-1,c,pp;system("cls"); //若哈希地址冲突,进行冲突处理benGetTime();for(i=0;i<NUM_BER;i++){c=0;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。

数据结构课程设计--哈希表实验报告

数据结构课程设计--哈希表实验报告

福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级: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。

《数据结构》课程设计-哈希表设计

《数据结构》课程设计-哈希表设计

目录课程设计任务书 01.问题描述 (2)1.1问题描述 (2)1.2基本要求 (2)1.3测试数据 (2)2.实现分析 (2)3.程序设计 (3)3.1存储结构设计 (3)3.2主要算法设计 (3)3.2.1程序主要函数原型及功能 (3)3.2.2各函数的实现 (4)3.2.3函数模块 (8)3.2.4程序流程图 (8)4.调试报告 (10)4.1调试中的问题 (10)4.2对设计和编码的讨论和分析 (10)5. 程序运行结果 (10)6.经验和体会 (12)6.1感受和体会 (12)6.2对算法改进的想法 (14)7.哈希表和源程序 (14)7.1哈希表 (14)7.2源程序 (15)本科生课程设计成绩评定表 (19)课程设计任务书学生姓名:专业班级:班指导教师:工作单位:计算机科学系题目: 哈希表设计初始条件:针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。

假设人名为中国人姓名的汉语拼音形式。

待填入哈希表的人名共有30个,取平均查找长度的上限为2。

哈希函数用除留余数法构造,用伪随机探测再散列发处理冲突。

测试用例见题集p166。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。

2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。

源程序要加注释。

如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。

时间安排:1、第19周完成。

2、7月1 日14:00到计算中心检查程序、交课程设计报告、源程序(CD盘)。

课程设计报告-哈希表

课程设计报告-哈希表

(此文档为word格式,下载后您可任意编辑修改!) 数据结构课程设计(哈希表的设计)院系专业班级学生姓名学号课程设计日期:2011年6月26日至2011年7 月7 日目录一、问题描述 (3)二、需求分析1、基本要求 (3)2、测试数据 (3)三、概要设计 (3)四、详细设计 (4)五、测试分析 (11)六、课程设计总结 (13)七、附录(源代码) (14)一、问题描述针对自己班级体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。

二、需求分析基本要求:假设人名为中国姓名的汉语拼音模式。

待填入哈希表的人名共有30个,取平均查找长度的上限为2。

哈希函数用除留余数法构造,用链表法处理冲突。

测试数据:输入30个人的姓名拼音,即30个字符串,然后用除留余数法构建哈希表并用链表法处理冲突,最后将结果输出,程序自动计算查找长度的总数和平均查找长度,然后用户可以根据需求进行查找操作。

三、概要设计四、详细设计头文件#include <stdio. 30 *哈希表长度*int sum=0,k=0;typedef struct Node*哈希表结构体*{char key_code[10];*哈希表地址*struct Node *next;}Node;typedef struct mode;}void Hash_Init(HashTable str[0]+str[1]+str[2]; }int Hash_Insert(HashTable 1;}Node* Hash_Search(HashTable NULL;} else if( p;}p = p->next;sum++;}}return NULL;}int Hash_Create(HashTable ");return 1;}int ;i++){printf("%4d",i);printf("%4d",");}return count2;}void Hash_Link()*链表法构造函数*{int key;int i;Node *node;HashTable ",k); *查找总长度*printf("ASL=%d8\n",k); *平均查找长度*printf("请输入要查找的数据:");*输入查找的姓名*scanf("%s",&key);node = Hash_Search(",sum);if(node != NULL)printf("查找成功!");elseprintf("查找不成功!");}void -1;di++){address=((data%P)+di)%;if(status[address]==0){;}int 1;else{for(di=1;di<=-1;di++)*哈希表中元素与查找元素不相等,查找下一元素* {address=((key%P)+di)%;if( di+1;break;}}}if(di>=)return 0;}int main()*主函数*{printf("\t\t\t************************\n");printf("\t\t\t 哈希表设计\n");printf("\n");printf("\t\t\t************************\n");printf("\n");Hash_Link();}五、测试分析测试数据:随机输入的30个人的姓名拼音测试过程:输入30个人的姓名拼音,观察输出结果,并进行查找操作测试结果:主界面:哈希表:六、课程设计总结这次数据结构课程设计持续了两周,在这两周中付出了很多,同样也得到了很多。

数据结构 程序设计 哈希表设计

数据结构 程序设计  哈希表设计

学号数据结构课程设计设计说明书哈希表设计起止日期:2011年12月12 日至2011 年12月16日学生姓名班级成绩指导教师(签字)电子与信息工程系2011年12月16日天津城市建设学院课程设计任务书2011—2012学年第1学期电子与信息工程系软件工程专业班级课程设计名称:数据结构课程设计设计题目:哈希表设计完成期限:自2011 年12 月12 日至2011 年12 月16 日共 1 周设计依据、要求及主要内容(可另加附页):一、设计目的熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。

二、设计要求(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。

凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;(4)认真编写课程设计报告。

三、设计内容1)问题描述针对某个集体中人名设计一个哈希表,使得平均查找长度不超过R,并完成相应的建表和查表程序。

2)基本要求假设人名为中国人姓名的汉语拼音形式。

待填入哈希表的人名共有30个,取平均查找长度的上限为2。

哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。

3)测试数据取读者周围较熟悉的30个人名。

四、参考文献1.王红梅.数据结构.清华大学出版社2.王红梅.数据结构学习辅导与实验指导.清华大学出版社3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社一、需求分析要建立一个哈希表,并完成查询的功能,首先要定义两个结构体,一个Name、一个Hash。

输入的时候一定要输入姓名的拼音,否则将无法实现。

二、问题求解对哈希表的查询,首先输入要查询人的姓名拼音,然后程序会根据拼音从第一个字母开始查找并输出其相应的ASCII值,依次向后查找,直到字符串结束,最后输出总的ASCII码值,所得ACSII值之和作为关键码,然后输出相应的查找长度。

数据结构课程设计-哈希表建立职工管理系统

数据结构课程设计-哈希表建立职工管理系统

一.问题描述职工的姓名通过哈希表建表,基于哈希表的查找,建立一个简单的职工管理系统。

可以利用自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。

对将班上同学看做职工进行管理,包括插入、删除、查找、排序等功能。

二.基本要求假设人名为中国姓名的汉语拼音形式。

待填入哈希表的人名共有30个,取平均查找长度的上限为2。

哈希函数用除留余数法构照,用链表法处理冲突。

职工对象包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。

(1)新增一名职工:将新增职工对象按姓名以字典方式职工管理文件中。

(2)删除一名职工:从职工管理文件中删除一名职工对象。

(3)查询:从职工管理文件中查询符合某些条件的职工。

(4)修改:检索某个职工对象,对其某些属性进行修改。

(5)排序:按某种需要对职工对象文件进行排序。

三.数据结构的设计哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。

也就是说,它通过把关键码值映射到表中一个位置来访问记录,加快查找的速度。

这个映射函数叫做散列函数,存放记录的数组叫做哈希表。

1.哈希表的构造方法多种多样,实际工作中需视不同的情况采用不同的哈希函数,经常在构建一个哈希表选择构造方法时需要考虑的因素有:计算哈希函数所需时间、关键字的长度、哈希表的大小、关键字的分布情况、记录的查找频率等。

本次题目要求采用除留余数法构造哈希函数,一般方法如下:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。

即 H(key) = key MOD p,p<=m不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。

对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。

由于职工主要以姓名为标志,于是将职工姓名的汉语拼音所对应的ASCII码进行相加,所得到的和作为关键字;取p等于表长30,则关键字除以30以后所得到的余数便是哈希地址。

数据结构课程设计-哈希表及其应用

数据结构课程设计-哈希表及其应用

学号:************课程设计题目哈希表及其应用教学院计算机学院专业09网络工程班级09网络工程(1)班姓名吴浪指导教师刘志远年月日课程设计任务书2010 ~2010 学年第 1 学期学生姓名:吴浪专业班级: 09网络工程指导教师刘志远工作部门:计算机学院一、课程设计题目哈希表及其应用二、课程设计内容建立一个小型信息管理系统(可以是图书、人事、学生、物资、商品等任何信息管理系统)。

要求:1.使用哈希查找表存储信息;2.实现查找、插入、删除、统计、输出等功能;三、进度安排1.初步完成总体设计,搭好框架;2.完成最低要求:尝试使用多种哈希函数和冲突解决方法,并通过实际运行测试给出自己的评价四、基本要求1.界面友好,函数功能要划分好2.程序要加必要的注释3.要提供程序测试方案教研室主任签名:年月日1 概述 (4)2 设计目的 (4)3 设计功能说明 (4)4 详细设计说明 (5)5 流程图 (5)6 程序代码 (6)7 程序运行结果 (15)8 总结 (19)参考文献 (19)成绩评定表 (20)数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁,只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。

通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实际动手能力。

为学生后继课程的学习打下良好的基础。

2 设计目的《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。

因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。

通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。

促使学生养成良好的编程习惯。

1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。

2.培养学生综合运用所学知识独立完成程序课题的能力。

数据结构课程设计

数据结构课程设计

数据结构课程设计报告题目:哈希表的设计与实现一、绪论1、课题:哈希表的设计与实现。

2、课题描述:设计哈希表实现电话号码查找系统。

3、基本功能:1)设每个记录有下列数据项:电话号码、用户名、地址;2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;3)查找并显示给定电话号码的记录;4)查找并显示给定用户名的记录。

二、设计方案1.数据结构的选择与设计本项目的设计算法采用的是哈希表。

该数据结构的类的定义设计如下:struct node //建节点{char name[8];//名字char address[20];//地址char num[11];//手机号node * next;//到邻接站点的指针};2、总体设计方案首先,构建模型,初始化数据;其次,为所需功能设计算法并实现;最后,设计界面,完善系统的人机交互功能。

3、详细设计方案(1)算法设计由于最终只需要从姓名和号码查找,所以需要建立两个哈希函数。

void hash(char num[11]) //哈希函数(号码){int i = 3;key=(int)num[2];while(num[i]!=NULL){key+=(int)num[i];i++;}key=key%20;}void hash2(char name[8]) //哈希函数(姓名){int i = 1;key2=(int)name[0];while(name[i]!=NULL){key2+=(int)name[i];}key2=key2%20;}然后,由于是电话簿,既然要查找,就得先输入以及保存,所以需要建立输入函数和保存函数。

node* input() //输入节点{node *temp;temp = new node;temp->next=NULL;cout<<"输入姓名:"<<endl;cin>>temp->name;cout<<"输入地址:"<<endl;cin>>temp->address;cout<<"输入电话:"<<endl;cin>>temp->num;return temp;}void save() //保存用户信息{node *p;for(i=0;i<20;i++){p=phone[i]->next;while(p){fstream iiout("out.txt", ios::out); iiout<<p->name<<"_"<<p->address<<"_"<<p->num<<endl;p=p->next;}}}之后,保存录入了之后,由于是通过姓名和号码查找,所以就需要建立两个查找函数。

数据结构课程设计报告——哈希表实现电话号码查询

数据结构课程设计报告——哈希表实现电话号码查询

数据结构课程设计报告一、需求分析1问题描述:根据需要设计出合理的函数,并由此建立相应的表。

要求:1)每个电话用户信息包括(姓名,电话,住址)信息。

2)可以使用姓名与地址查找相应的用户信息。

3)使用表实现。

使用开放定址法解决冲突。

2 基本要求:1)记录每个用户的姓名、地址和电话。

2)从键盘输入,以姓名和地址为关键字分别建立表。

3)用开放地址法解决冲突。

4)分别按姓名和地址查找并显示电话号码。

二、概要设计三、详细设计定义结构表{定义表内的所有成员}[];( x[])关键字转换为数值{求字符数组x每个字符对应的值的绝对值之和,并返回最后结果}( )创建表{创建表,并初始化它}( d) 按姓名插入{以姓名为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。

若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。

若还有冲突重复上一步。

当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。

}( d)按地址插入{以地址为关键字,调用关键字转换函数将对应的电话号码存储到相应的存储空间。

若该位置已经被存储,则向后移一位(当移到最后一位,就移到头部继续)。

若还有冲突重复上一步。

当所有空间都查过一遍,发现没有空位,则输出“没有存储空间”。

}( )表插入{输入用户姓名、地址和电话,分别调用按姓名插入和按地址插入函数进行插入。

重复上面的步骤,直到你不想继续或空间已满。

}( )按姓名查找{输入你想要查询的姓名,对它进行转换,再查找。

若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。

若还有冲突重复上一步。

当所有空间都查过一遍,发现没有找到,则输出“不存在”。

若该位置空,则输出“不存在”。

若查找到,则输出电话号码。

}( )按地址查找{输入你想要查询的地址,对它进行转换,再查找。

若该位置不空或求得的关键字所对应的数值与该位置的数值不相等,则向后移一位(当移到最后一位,就移到头部继续)。

数据结构课程设计哈希表设计问题

数据结构课程设计哈希表设计问题

资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载数据结构课程设计哈希表设计问题地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容目录TOC \o "1-2" \h \z \uHYPERLINK \l "_Toc307911744" 1 前言 PAGEREF_Toc307911744 \h 1HYPERLINK \l "_Toc307911745" 2 需求分析 PAGEREF_Toc307911745 \h 1HYPERLINK \l "_Toc307911746" 2.1 任务和要求 PAGEREF _Toc307911746 \h 1HYPERLINK \l "_Toc307911747" 2.2 运行环境 PAGEREF _Toc307911747 \h 1HYPERLINK \l "_Toc307911748" 2.3 开发工具 2HYPERLINK \l "_Toc307911749" 3 分析和设计 2HYPERLINK \l "_Toc307911750" 3.1 系统分析及设计思路 2HYPERLINK \l "_Toc307911751" 3.2 主要数据结构及算法 2HYPERLINK \l "_Toc307911752" 3.3 函数流程图 3HYPERLINK \l "_Toc307911753" 4 具体代码实现 6HYPERLINK \l "_Toc307911754" 5 课程设计总结 1 5HYPERLINK \l "_Toc307911755" 5.1 程序运行结果或预期运行结果1 5HYPERLINK \l "_Toc307911756" 5.2 设计结论 1 7HYPERLINK \l "_Toc307911757" 参考文献 1 7HYPERLINK \l "_Toc307911758" 致谢 1 71 前言从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。

(完整word版)哈希表《数据结构》课程设计

(完整word版)哈希表《数据结构》课程设计

数学与计算机学院课程设计说明书课程名称: 数据结构-课程设计课程代码: 8404181题目:哈希表的设计与实现年级/专业/班: 2009级软件工程3班学生姓名:张加发学号:312009*********开始时间:2011 年06 月20 日完成时间:2011 年06 月29 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书撰写质量(45)总分(100)指导教师签名: 年月日数据结构课程设计任务书学院名称: 数学与计算机学院课程代码:8404181专业:软件工程年级:2009级一、设计题目哈希表的设计与实现二、主要内容设计哈希表实现电话号码查找系统,要求如下:1)设每个记录有下列数据项:电话号码、用户名、地址;2)从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表(要求设计两种以上不同的散列函数);3)采用两种以上的方法解决冲突;4)查找并显示给定电话号码的记录;5)查找并显示给定用户名的记录。

三、具体要求及应提交的材料1.每个同学以自己的学号和姓名建一个文件夹,如:“312009*********张三”。

里面应包括:学生按照课程设计的具体要求所开发的所有源程序(应该放到一个文件夹中)、任务书和课程设计说明书的电子文档。

2.打印的课程设计说明书(注意:在封面后夹入打印的“任务书”以后再装订)。

四、主要技术路线提示法、除留余数法等,解决冲突的方法也较多,常用:开放定址法、链地址法等。

五、进度安排共计两周时间,建议进度安排如下:选题,应该在上机实验之前完成需求分析、概要设计可分配4学时完成详细设计可分配4学时调试和分析可分配10学时.2学时的机动,可用于答辩及按教师要求修改课程设计说明书。

注:只用课内上机时间一般不能完成设计任务,所以需要学生自行安排时间做补充.六、推荐参考资料[1]苏仕华等编著,数据结构课程设计,机械工业出版社,2007[2]严蔚敏等编著,数据结构(C语言版),清华大学出版社,2003[3]严蔚敏等编著,数据结构题集(C语言版),清华大学出版社,2003指导教师签名日期年月日系主任审核日期年月日摘要分析了对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的应用,对现实复杂问题的分析建模和解决方法!分析了针对系统的需求所要执行的解决方法的可行性,正确性.完成系统前需要进行问题描述、系统分析、设计建模、代码实现、调试修改,结果分析。

数据结构课程设计hash

数据结构课程设计hash

数据结构课程设计hash一、课程目标知识目标:1. 理解哈希表的基本概念,掌握哈希表的构建、插入、删除等操作方法;2. 了解哈希冲突的类型及解决方法,掌握线性探查法、链地址法等常见解决策略;3. 掌握哈希表的平均查找长度及其计算方法,了解影响哈希表性能的因素。

技能目标:1. 能够运用哈希表解决实际问题,如查找、统计等;2. 能够编写简单的哈希表程序,实现基本操作,并进行性能分析;3. 能够分析哈希表在不同应用场景下的优缺点,选择合适的哈希策略。

情感态度价值观目标:1. 培养学生主动探索、积极思考的学习态度,增强对数据结构知识的好奇心和求知欲;2. 培养学生的团队合作意识,学会在团队中分工协作,共同解决问题;3. 引导学生认识到数据结构在实际应用中的价值,激发学生将所学知识应用于实际问题的兴趣。

分析课程性质、学生特点和教学要求:1. 本课程为高中信息技术学科的数据结构部分,旨在让学生掌握哈希表的基本知识和应用;2. 学生已具备一定的编程基础和逻辑思维能力,对数据结构有一定了解;3. 教学要求注重理论与实践相结合,强调学生的动手实践能力和问题解决能力的培养。

二、教学内容1. 哈希表的基本概念与性质- 哈希表的定义、作用及适用场景;- 哈希表的存储结构及关键术语介绍;- 哈希表的平均查找长度、时间复杂度分析。

2. 哈希函数的构造方法- 直接定址法、数字分析法、平方取中法等常见哈希函数构造方法;- 哈希函数的评估标准:均匀性、冲突率、计算复杂度等。

3. 哈希冲突的解决策略- 线性探查法、二次探查法、链地址法等解决策略;- 各类解决策略的优缺点及适用场景。

4. 哈希表的构建与操作- 哈希表的初始化、插入、删除、查找等基本操作;- 哈希表操作程序的编写与性能分析。

5. 哈希表的应用实例- 案例分析:单词统计、查找重复元素等;- 学生实践:设计并实现一个简单的哈希表程序。

教学内容安排与进度:第一课时:哈希表基本概念与性质、哈希函数构造方法;第二课时:哈希冲突解决策略、哈希表构建与操作;第三课时:哈希表应用实例分析、学生实践。

《哈希表》课程设计报告

《哈希表》课程设计报告

《哈希表》课程设计报告数据结构散列表(哈希表)课程设计报告及源代码《哈希表的操作》设计报告一目的通过此次课程设计,让学生充分掌握对哈希表的有关操作,例如除留余数法的运用,处理冲突的三个办法:线性探测再散列,二次探测再散列,连地址法等。

加深学生对于哈希表这种独特存储方式(区别于线性存储和链式存储)的理解,和几种算法之间的优越性的体会。

二需求分析1、功能需求①.用户能够自定义输入单词,存入哈希表里;②.用户能够对当前哈希表进行管理。

操作内容包括:查看当前哈希表、搜索某个单词、插入任意单词、删除表中某个单词、查看当前表的平均搜索长度、置空当前哈希表。

③.程序有良好的交互界面,有操作提示和出错提示,方便用户使用和进出入程序。

2、程序约束①.哈希表的散列方法为除留余数法,处理冲突的办法为线性探测在散列。

②.使用C/C++语言编写,程序模块化设计。

三概要设计1、模块设计程序分为主程序模块和哈希表类定义模块,主程序存放在main.app中,哈希表类存放在HashTable.h头文件中。

①.主程序模块用于数据和DOS用户界面的初始化,主函数mai()内部定义子函数function(),调用哈希表类中的各个功能函数。

②.哈希表类定义Calculate(string s) 单词key值计算函数,类友元形参s传送输入的单词。

由于单词为string型,不方便直接拿来参与取余数计算,故用计算函数求出一个key来,同时可以减少冲突(字母相同的单词key有可能不同)。

FindPos(int key,string value) 地址查找函数,类成员key传送计算出的单词的关键值,value传送输入的单词,下同。

此函数为查找、插入、删除等函数提供地址搜索服务。

Search(int key,string value) 查找函数,类成员 Insert(string value) 插入函数,类成员 Remove(int key,string value) 删除函数,类成员 makeEmpty() 置空哈希表函数,类成员感谢您的阅读,祝您生活愉快。

完整word版,《数据结构》实验五哈希表

完整word版,《数据结构》实验五哈希表

实验五查找一、实验目的(1)掌握哈希表的构造和查找过程及其算法设计;(2)掌握哈希表的平均查找长度的计算。

二、实验内容编写程序,实现哈希表的相关运算,并完成以下功能:(1)建立关键字序列(16,74,60,43,54,90,46,31,29,88,77)对应的哈希表A[0..12],哈希函数为H(k)=k%13,并采用开放地址法中的线性探测法解决冲突。

要求输出构造的哈希表。

(2)在上述哈希表中查找关键字为29的记录,输出其位置和比较次数;(3)在上述哈希表中删除关键字为77的记录,再将其插入。

(4)输出上述哈希表查找成功时的平均查找长度。

三、设计思路及程序代码(包括程序结构(即函数调用关系)、算法功能描述或流程图、程序代码)#include<stdio.h>#define MaxSize 100#define NULLKEY -1#define DELKEY -2typedef int KeyType;typedef char *InfoType;typedef struct{KeyType key;InfoType data;int count;}HashData;typedef HashData HashTable[MaxSize];void InsertHT(HashTable ha,int&n,KeyType k,int p)//将关键字k插入到哈希表中{int i,adr;adr=k%p;if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)//x[j]可以直接放在哈希表中{ha[adr].key=k;ha[adr].count=1;}else{i=1;do{adr=(adr+1)%p;i++;}while(ha[adr].key!=NULLKEY&&ha[adr].key!=DELKEY);ha[adr].key=k;ha[adr].count=i;}n++;}void CreateHT(HashTable ha,KeyType x[],int n,int m,int p)//创建哈希表{int i,n1=0;for(i=0;i<m;i++)//哈希表置初值{ha[i].key=NULLKEY;ha[i].count=0;}for(i=0;i<n;i++)InsertHT(ha,n1,x[i],p);}int SearchHT(HashTable ha,int p,KeyType k)//在哈希表中查找关键字k {int i=0,adr;adr=k%p;while(ha[adr].key!=NULLKEY&&ha[adr].key!=k){i++;//采用线性探查找下一个地址adr=(adr+1)%p;}if(ha[adr].key==k)//查找成功return adr;else return -1;//查找失败}int DeleteHT(HashTable ha,int p,int k,int &n)//删除哈希表中的关键字{int adr;adr=SearchHT(ha,p,k);if(adr!=-1)//在哈希表中找到该关键字{ha[adr].key=DELKEY;n--;//哈希表的长度减1return 1;}else//在哈希表中未找到该关键字return 0;}void DispHT(HashTable ha,int n,int m)//输出哈希表{float avg=0;int i;printf("哈希表的地址:\t");for(i=0;i<m;i++)printf("%3d",i);printf("\n");printf("哈希表的关键字为:\t");for(i=0;i<m;i++)if(ha[i].key==NULLKEY||ha[i].key==DELKEY)printf(" ");elseprintf("%3d",ha[i].key);printf("\n");}void ASL(HashTable ha,int n,int m,int p)//求平均查找长度{int i;int succ=0,unsucc=0;for(i=0;i<m;i++)if(ha[i].key!=NULLKEY)succ+=ha[i].count;//累计成功时的总关键字比较次数 printf("成功情况下ASL(%d)=%g\n",n,succ*1.0/n);}int main(){int x[]={16,74,60,43,54,90,46,31,29,88,77};int n=11,m=13,p=13,i,k=29;HashTable ha;printf("(1)\n");CreateHT(ha,x,n,m,p);//构造哈希表printf("\n");DispHT(ha,n,m);//输出哈希表printf("(2)\n");printf("查找关键字29的记录:\n");i=SearchHT(ha,p,k);if(i!=-1){printf("ha[%d].key=%d\n",i,k);printf("查找关键字29的比较次数为:%d\n",i);}elseprintf("未找到%d\n",k);printf("(3)\n");k=77;printf("删除关键字%d:\n",k);DeleteHT(ha,p,k,n);DispHT(ha,n,m);//输出哈希表i=SearchHT(ha,p,k);if(i!=-1)printf("ha[%d].key=%d\n",i,k);elseprintf("未找到%d\n",k);printf("将删除的关键字77重新插入:\n",k);//重新插入关键字77 InsertHT(ha,n,k,p);DispHT(ha,n,m);printf("(4)\n");printf("查找成功的平均长度为:\n");ASL(ha,n,m,p);return 0;}四、测试结果(程序运行结果采用截图的方式打印)五、实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等)。

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

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

合肥学院计算机科学与技术系课程设计报告2009〜2010学年第二学期课程__________ 数据结构与算法___________ 课程设计名称_____________ 哈希表的设计与实现 ___________2010年5月课程设计目的“数据结构与算法课程设计”是计算机科学与技术专业学生的集中实践性环节之一,是学习“数据结构与算法” 理论和实验课程后进行的一次全面的综合练习。

其目的是要达到理论与实际应用相结合,提高学生组织数据及编写程序的能力,使学生能够根据问题要求和数据对象的特性,学会数据组织的方法,把现实世界中的实际问题在计算机内部表示出来并用软件解决问题,培养良好的程序设计技能。

一、问题分析和任务定义1、问题分析要完成如下要求:设计哈希表实现电话号码查询系统。

实现本程序需要解决以下几个问题:(1)如何定义一个包括电话号码、用户名、地址的节点。

(2)如何以电话号码和用户名为关键字建立哈希表。

(3)用什么方法解决冲突。

(4)如何查找并显示给定电话号码的记录。

(5)如何查找并显示给定用户名的记录。

2 任务定义1 、由问题分析知,本设计要求分别以电话号码和用户名为关键字建立哈希表,z 在此基础上实现查找功能。

本实验是要我们分析怎么样很好的解决散列问题,从而建立一比较合理的哈希表。

由于长度无法确定,并且如果采用线性探测法散列算法,删除结点会引起“信息丢失”的问题。

所以采用链地址法散列算法。

采用链地址法,当出现同义词冲突时,可以使用链表结构把同义词链接在一起,即同义词的存储地址不是散列表中其他的空地址。

根据问题分析,我们可以定义有3 个域的节点,这三个域分别为电话号码char num[30] ,姓名char name[30] ,地址char address[30] 。

这种类型的每个节点对应链表中的每个节点,其中电话号码和姓名可分别作关键字实现哈希表的创建。

二、数据结构的选择和概要设计1、数据结构的选择数据结构:散列结构。

哈希表设计-数据结构课程设计

哈希表设计-数据结构课程设计

输出超找结果
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;//伪随机探测再散列法处理冲突
取读者周围较熟悉的 30 个人的姓名。 4. 实现提示
如果随机数自行构造,则应首先调整好随机函数,使其分布均匀。人名的长度均不超 过 19 个字符(最长的人名如:庄双双(Zhuang Shuangshuang))。字符的取码方法可直接利 用 C 语言中的 toascii 函数,并可先对过长的人名先作折叠处理。
四、调试分析
编译环境为 CodeBlocks。
山东科技大学学生课程设计
山东科技大学学生课程设计
山东科技大学学生课程设计
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 码相加,所得的整数做 为哈希表的关键字

哈希表设计与实现数据结构课程设计

哈希表设计与实现数据结构课程设计

课程名称:数据结构XXXXXXXX本科学生课程设计(论文)题目哈希表的设计与实现姓名 XXX学号 XXXXXXXXXXXX学部计算机科学与技术专业、年级计算机科学与技术大二指导教师 XX2010 年 11月 28日摘要随着信息技术的发展,关于各种程序中的数据结构也是层出不穷,对于项目某一方面的计算或者是某一方面的研究,出现了专门的数据结构,哈希表就是其中之一,哈希表作为另类的一种数据结构,其作用也是区别于其它同类的数据结构的,它是由两部分组成的:键(key)和值,通过键可以迅速的查找到你需要的值。

常见的构造哈希函数的方法有直接定址法除留余数法平方取中法数字分析法等。

一般创建哈希表时可能会出现很多的冲突,常用的处理冲突的方法为开放定址法再哈希法链地址法建立一个公共溢出区。

关键词: 数据结构;哈希表;键(key);目录第1章前言与系统实现 ____________________________________________ 4 1.1前言__________________________________________________________ 4 1.2系统实现______________________________________________________ 51.2.1 开发环境_________________________________________________ 51.2.2 Visual C++环境的安装_____________________________________ 5 第2章系统功能分析_______________________________________________ 6 2.1 系统功能需求分析 ____________________________________________ 6 2.2 任务定义 ____________________________________________________ 6 第3章总体设计___________________________________________________ 7 3.1系统数据结构__________________________________________________ 7 3.2主要算法流程图________________________________________________ 83.2.1 以姓名为关键字的CreateHashList()函数流程图________________ 83.2.2 哈希表查找算法流程图______________________________________ 93.2.3主程序流程图_____________________________________________ 10 第4章详细设计和编码____________________________________________ 114.1节点的建立___________________________________________________ 11 4.2 对哈希函数的定义 ___________________________________________ 11 4.3 创建哈希表算法、代码如下所示: ________________________________ 124.3.1 算法_____________________________________________________ 124.3.2代码_____________________________________________________ 12 4.4哈希查找_____________________________________________________ 13 4.5显示哈希表___________________________________________________ 16 4.6主菜单设计___________________________________________________ 18 4.7 主函数设计 __________________________________________________ 18 第5章程序运行测试_______________________________________________ 215.1程序主界面___________________________________________________ 21 5.2哈希表初始化_________________________________________________ 21 5.3按姓名查找记录_______________________________________________ 23 5.4显示哈希表全部记录___________________________________________ 24 总结______________________________________________________________ 25 参考文献__________________________________________________________ 26第1章前言与系统实现1.1前言在信息化时代的今天,计算机技术已经是发展到一个很可观的地步了,特别是面向窗口的操作系统的出现,使得程序设计更加的容易了。

哈希表课设报告

哈希表课设报告

一、【问题描述】a)题目内容针对某个单位电话号码簿,设计一个哈希表,并完成相应的建表和查表程序。

b)基本要求1)假定每个记录有下列数据项:电话号码、用户名、地址。

2)以用户名和电话号码为关键字建立哈希表,哈希函数用除留取余数法构造,采用线性探测法解决冲突。

3)可以插入、查找、删除并显示给定用户名的记录,并计算查找长度。

哈希表保存到文件中。

4)哈希表保存到文件中。

二、【需求分析】a)软件的基本功能根据用户的选择,分别以姓名和电话号码做为关键字生成哈希表。

生成哈希表后用户可以根据相应关键字进行数据的查找,若查找到对应的数据则将数据输出到屏幕,在用户选择显示哈希表时,显示完整的哈希表。

b)输入/输出形式输入:自己打入姓名、电话号码、住址;数据的格式为:姓名、电话号码、住址或电话号码、姓名、地址。

输出:在用户需要时,将哈希表显示在屏幕上。

c)测试数据要求测试数据为字符串。

三、【概要设计】a)数据类型定义结构体类型存储每条记录。

struct fen //联系人信息结构体{string name;string add;string num;string phone;}st1,st2,b[100],b1[100];b)主程序流程及模块调用关系。

c)各函数功能void gotoxy(int x, int y)//控制坐标void Menu()//菜单void Menu1()//菜单void Create() //创建名字哈希表void Create1() //创建电话哈希表V oid allplay()//输出全部联系人V oid allplay1()//输出全部联系人void chazhao()//查找函数void chazhao1()//查找函数void choice()//选择函数void choice()1//选择函数void clean() //清空电话簿void clean()1 //清空电话簿void del()//删除单个联系人void del()1//删除单个联系人void fan()//泛查找函数void fan()1//泛查找函数void filename(int g)//向文件导入数据void filename1(int g)//向文件导入数据int H1(string k)//哈希取模函数int H1(string k)1//哈希取模函数void hash()//哈希查找函数(精确查找)void hash1()//哈希查找函数(精确查找)void jude()//判断是否有重复数据void jude()1//判断是否有重复数据int main()//主函数void putfile()//从文件读入数据void putfile1()//从文件读入数据四、【编码与调试分析】a)编码与调试过程中遇到的问题及解决的办法(1)在数据冲突的时候,不是向后在探查一位,而是直接覆盖了原有数据,这主要的问题出现在当时没有彻底理解线性探测算法,代码的先后有些问题使得后面的代码根本没有运行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

洛阳理工学院课程设计说明书课程名称数据结构设计课题哈希表的设计与实现专业班级学号姓名完成日期 2课程设计任务书设计题目:哈希表的设计与实现设计内容与要求:设计哈希表实现电话号码查询系统。

[基本要求]1、设每个记录有下列数据项:电话号码、用户名、地址;2、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;3、采用再哈希法解决冲突;4、查找并显示给定电话号码的记录;5、查找并显示给定用户名的记录。

6、在哈希函数确定的前提下,考察平均查找长度的变化。

指导教师:2014 年课程设计评语成绩:指导教师:年月日【问题描述】如何设计一个结构体数组使该数组中每个元素包含电话号码、用户名、地址。

如何分别以电话号码和用户名为关键字建立哈希表。

如何利用线性探测再散列法解决冲突。

如何实现用哈希法查找并显示给定电话号码的记录。

如何查找并显示给定用户的记录。

手工计算查找不成功的平均查找长度。

【基本要求】设计哈希表实现电话号码查询系统。

设计程序完成以下要求:(1)、设每个记录有下列数据项:电话号码、用户名、地址;(2)、从键盘输入各记录,分别以电话号码和用户名为关键字建立哈希表;(3)、采用再哈希法解决冲突(4)、查找并显示给定电话号码的记录;(5)、查找并显示给定用户的记录。

(6)、在哈希函数确定的前提下,考察平均查找长度的变化。

【测试数据】1.用户名:weiguo,号码:123,地址:gansu2.用户名:zhangkui,号码:321,地址:shanxi【算法思想】进入主函数,用户输入1:输入哈希表元素,然后再选择2或者3按照用户名或者电话号码散列,在这下面又有分支语句选择解决冲突的办法,用线性探测再散列还是再哈希法。

生成哈希表之后,选择查找操作3分别以用户名和电话号码为关键字进行查找。

最后,输出查找不成功的平均查找长度。

在本程序当中用了两种解决冲突的办法,分别是线性探测再散列和再哈希法。

哈希函数构造方法是,除留余数法。

具体流程图1所示:图 1 具体流程图【模块划分】本程序在菜单选项下包含六个子模块,如图2所示图2 模块划分【数据结构】本设计涉及到的数据结构为:哈希表。

要求输入电话号码、用户名、地址三个信息,并要求分别以电话号码和用户名为关键字进行查找,所以本问题要用到两个哈希函数,进行哈希查找。

/*哈希表结构体*/typedef struct{char name[20]; //用户名char phone[20];//电话char add[30]; //地址}Record;Record Inf[M];//全局变量Record H[M]; //全局变量【测试情况】1.运行程序,显示主菜单并选择选项1来创建哈希表2.执行选项1,输入元素内容3.执行选项2,按用户名散列创建哈希表4.执行选项3,按号码散列创建哈希表5.执行选项4,按用户名查找6.执行选项4,按号码查找7.执行选项5,输出查找不成功的平均查找长度【心得】【源程序】/*****电话号码查询系统*****/#include<stdio.h>#include<string.h>#include<stdlib.h>#define M 10#define NULLKEY "\0"/*哈希表结构体*/typedef struct{char name[20]; //用户名char phone[20];//电话char add[20]; //地址}Record;Record Inf[M];//定义辅助数组为全局变量Record H[M]; //定义哈希表为全局变量/*菜单函数*/int menu(){int m;system("cls");system("color 0a");printf("\t\t************电话号码查询系统*************\n");printf("\n");printf("\t\t______________ 主菜单_______________\n");printf("\t\t| 1. 哈希表的创建|\n");printf("\t\t| 2. 按用户名散列|\n");printf("\t\t| 3. 按号码散列|\n");printf("\t\t| 4. 查找操作|\n");printf("\t\t| 5. 平均查找长度|\n");printf("\t\t| 0. 退出程序|\n");printf("\t\t-----------------------------------------\n");printf("\n");printf("\t\t\t 请输入您的选项<0-5>:\n");scanf("%d",&m);return(m);}//创建辅助数组int Create(Record H[M]){int i;char sign;for(i=0;i<10;i++)//初始化哈希表{strcpy( H[i].add,"\0");strcpy( H[i].phone,"\0");strcpy( H[i].name,"\0");}i=0;while(sign!='n'&&sign!='N'){printf("请输入名字\n");scanf("%s",Inf[i].name);printf("请输入号码\n");scanf("%s",Inf[i].phone);printf("请输入地址\n");scanf("%s",Inf[i].add);printf("\t\t\t还需要继续输入吗?(Y/N)");scanf("\t\t\t%c",&sign);i++;}return i;}//以用户名为关键字的哈希函数int Hash_name(char name[20]){int i=0;int a=0;while(name[i]!='\0'){a=a+name[i];i++;}a=a%7;//对小于哈希表的最大素数求余,此处哈希表长为10,对7求余return(a);}//再哈希int name_again(char name[20]){int i,h;h=(int)name[1];for(i=2;i<20;i++)h=h+(int)name[i];h=h%7;return h;}//以用户名为关键字创建哈希表void creat_name(Record Inf[M],int m,Record H[M]){int j,key=0;for(j=0;j<m;j++){key=Hash_name(Inf[j].name);//计算哈希地址while(1){if(strcmp(H[key].name,NULLKEY)==0)//判断该位置是否为空,不为空就把辅助数组中的元素存到该位置{strcpy(H[key].name,Inf[j].name);strcpy(H[key].phone,Inf[j].phone);strcpy(H[key].add,Inf[j].add);break;}elsekey++;//如果为空,采用线性探测法,将元素后移 }}}//再哈希法void again_put(Record Inf[M],int m,Record H[M]){int j,key=0;for(j=0;j<m;j++){key=Hash_name(Inf[j].name);//计算哈希地址while(1){if(strcmp(H[key].name,NULLKEY)==0)//辅助数组中的元素存到该位置 {strcpy(H[key].name,Inf[j].name);strcpy(H[key].phone,Inf[j].phone);strcpy(H[key].add,Inf[j].add);break;}elsekey=name_again(Inf[j].name);//再哈希} }}//以号码为关键字的哈希函数int Hash_phone(char phone[20]){int i=0;int b=0;while(phone[i]!='\0')//计算电话号码中每个字符的ASCII码值相加{b=b+phone[i];i++;}b=b%7;//对小于哈希表的最大素数求余,此处哈希表长为10,对7求余return(b);}//再哈希int phone_again(char phone[20]){int i,h;h=(int)phone[1];for(i=2;i<20;i++)h=h+(int)phone[i];h=h%7;return h;}//以电话号码为关键字创建哈希表void creat_phone(Record Inf[M],int m,Record H[M]){int j,key=0;for(j=0;j<m;j++){key=Hash_phone(Inf[j].phone);//计算哈希地址while(1){if(strcmp(H[key].phone,NULLKEY)==0)//把辅助数组中的元素存到该位置{strcpy(H[key].name,Inf[j].name);strcpy(H[key].phone,Inf[j].phone);strcpy(H[key].add,Inf[j].add);break;}elsekey++;//如果为空,采用线性探测法,将元素后移}}}//再哈希法void again_put2(Record Inf[M],int m,Record H[M]){int j,key=0;for(j=0;j<m;j++){key=Hash_phone(Inf[j].phone);//计算哈希地址while(1){if(strcmp(H[key].phone,NULLKEY)==0)//判断该位置是否为空,不为空就把辅助数组中的元素存到该位置{strcpy(H[key].name,Inf[j].name);strcpy(H[key].phone,Inf[j].phone);strcpy(H[key].add,Inf[j].add);break;}elsekey=phone_again(Inf[j].phone);//再哈希 }}}//按姓名查找int Search_name(Record H[M],char name[20]){int h0;int i;int hi;int result;h0=Hash_name(name);if (H[h0].name==NULLKEY){printf("查找名字不存在!\n");return (-1);}else{result = strcmp(H[h0].name,name);if (result == 0)return (h0);else // 用线性探测再散列解决冲突{for (i=1; i<=M-1; i++){hi=(h0+i) % M;if (H[hi].name==NULLKEY)return (-1);else{result = strcmp(H[hi].name,name);if (result == 0)return (hi);}}return (-1);}}}//按号码查找int Search_phone(Record H[M],char phone[20]){int h0;int i;int hi;int result;h0=Hash_phone(phone);if (H[h0].phone==NULLKEY){printf("查找号码不存在!\n");return (-1);}else{result = strcmp(H[h0].phone,phone);if (result == 0)return (h0);else // 用线性探测再散列解决冲突{for (i=1; i<=M-1; i++){hi=(h0+i) % M;if (H[hi].phone==NULLKEY)return (-1);else{result = strcmp(H[hi].phone,phone);if (result == 0)return (hi);}}return (-1);}}}//以用户名为关键字的哈希表的输出函数void Print_name(Record H[M]){int i;printf("\t哈希地址\t用户名\t\t号码\t\t地址\n");for(i=0;i<10;i++){if(strcmp(H[i].name,"\0")!=0){printf("\t%d\t\t%s\t\t%s\t\t%s\n",i,H[i].name,H[i].phone,H[i].add);}}}//以电话号码为关键字的哈希表的输出函数void Print_phone(Record H[M]){int i;printf("\t哈希地址\t用户名\t\t号码\t\t地址\n");for(i=0;i<10;i++){if(strcmp(H[i].phone,"\0")!=0){printf("\t%d\t\t%s\t\t%s\t\t%s\n",i,H[i].name,H[i].phone,H[i].add);}}}//查找不成功的平均查找长度void unsucc_length(int m){char phone[20];int i,j;int count;int asl=0;float unasl;Hash_phone(phone);for(i=0;i<7;i++){j=i;count=1;while(strcmp(H[j].name,NULLKEY)!=0){count++;j=(j+1)%7;}asl=asl+count;}unasl=(float)asl/7;printf("查找不成功的平均查找长度为:%5.2f\n",unasl); }void main()//主函数{char name[20],phone[20];int m;int n,p;int find;int w,k;while(1){switch(menu()){case 1:m=Create(H);//创建辅助数组break;case 2:printf("\t\t\t***********************\n");printf("\t\t\t**** 1.线性再散列****\n");printf("\t\t\t**** 2.再哈希法散列 ****\n");printf("\t\t\t**** 3.退出本菜单 ****\n");printf("\t\t\t***********************\n");printf("输入散列选项 <0-2> :\n");scanf("%d",&p);switch(p){case 1:creat_name(Inf,m,H);Print_name(H);break;case 2:again_put(Inf,m,H);Print_name(H);break;}break;case 3: printf("\t\t\t***********************\n");printf("\t\t\t**** 1.线性再散列****\n");printf("\t\t\t**** 2.再哈希法散列 ****\n");printf("\t\t\t**** 3.退出本菜单 ****\n");printf("\t\t\t***********************\n");printf("输入散列选项 <0-2> :\n");scanf("%d",&n);switch(n){case 1:creat_phone(Inf,m,H);Print_phone(H);break;case 2:again_put(Inf,m,H);Print_phone(H);break;}break;case 4:printf("\t\t\t***********************\n");printf("\t\t\t**** 1.按用户名查询****\n");printf("\t\t\t**** 2.按电话查询 ****\n");printf("\t\t\t**** 3.退出本菜单 ****\n");printf("\t\t\t***********************\n");printf("输入查找条件 <0-2> :\n");scanf("%d",&find);switch(find){case 1:printf("\n请输入要查找的名字:\n");scanf("%s",name);k=Search_name(H,name);//k=Hash_again( H, name);if(k!=-1){printf("查找该人的信息是:\n");printf("查找的用户名是:%s\n",H[k].name);printf("查找的电话号码是:%s\n",H[k].phone);printf("查找的地址是:%s\n",H[k].add);}break;case 2:printf("请输入要查找的号码:\n");scanf("%s",phone);w=Search_phone(H,phone);//w=Hash_phone(H,phone);if(w!=-1){printf("查找该人的信息是:\n");printf("查找的用户名是:%s\n",H[w].name);printf("查找的电话号码是:%s\n",H[w].phone);printf("查找的地址是:%s\n",H[w].add);}break;}break;case 5:printf("\n");unsucc_length(m);printf("\n");break;case 0:printf("\n");printf("欢迎下次使用\n");printf("\n");exit(0);break;default:printf("\t\t ***********************************\n");printf("\t\t 输入错误,请输入列表中存在的编号 \n ");printf("\t\t ***********************************\n");}printf("\t\t\t *************\n");printf("\t\t\t 按任意键返回\n");printf("\t\t\t *************\n");getch();fflush (stdin);//清空输入缓存}}。

相关文档
最新文档