1、用散列表建立通讯录某某学院课程设计报告课程名称:数据结构与算法设计题目: 用散列表建立通讯录 系 别:计算机科学与技术专 业:计算机科学与技术 组 别: 第六组 起止日期:2011年5月20日2011年6月20日 指导教师: 杨斌 计算机科学与技术系二一 一年制课程设计任务书课程设计题目建立通讯录组长杨光学号2010211133班级10计科1班系别计算机科学与技术专业10计算机科学与技术组员王春、赵宗辉、X擎昱、杨光指导教师杨斌课程设计目的1熟练掌握C语言的根本知识和技能;2根本掌握面向对象程序设计的根本思路和方法;3能够利用所学的根本知识和技能,解决简单的程序设计问题。课程设计所需环境课程设
2、计任务要求(1) 设每个记录有如下数据项:、用户名、地址; (2) 从键盘输入各记录,分别以为关键字建立散列表; (3)采用二次探测再散列法解决冲突;(4)查找并显示给定的记录;(5) 通讯录信息文件保存;(6) 要求人机界面友好,使用图形化界面;课程设计工作进度计划序号起止日期工 作 内 容分工情况12011概要设计王春、赵宗辉22011.6.1 详细代码X擎昱显示语言选单、创建、在通讯录的结尾写入信息;王春查询与修改;赵宗辉删除与显示;杨光退出、文件的操作32011.6.4 需求分析X擎昱42011.6.8 调试与操作说明全体成员5总结与体会全体成员6引言杨光教研室审核意见:教研室主任签字
3、: 年 月 日目录格式在做修改,请按照第三组的格式或者模板的格式认证修改!一、引言“课程设计是大学里考查在校学生对本专业所学的知识掌握情况的一种方法,也是对学生对团队合作精神的一种考验。本课程设计的要求是用散列表建立通讯录。其中,散列表主要是运用数据结构中的除留余数发,而处理冲突是运用二次探测法(1)。在通信录的存储中,主要是先用一个数组将其存储,这主要是为了在建立哈希表的时候便于操作。建立哈希表时,用的是将字符型数字转化为整形数据,用的是atoi()函数,在2头文件里。由于这次的课程设计,在通信录中要操作的功能有很多,所以在主函数里用了switch()函数,通过case的选值不同执行不同的操
4、作。由于在现示主界面的时候,要运用Esc键返回主界面,所以用了getch()函数来得到Esc键,而getch()函数实在(3)头文件里。在本次设计中,因为在删除与查找的过程中,要比拟输入的字符串与保存的字符串是否相等,用到了strcmp()函数,它是包含在(4)头文件里。课程设计中,为了使界面效果更好一些,我们使用了清屏函数system(“cls(5)头文件里和得到系统时间的函数,包含在windows.h头文件里。在本次的课程设计中,我们小组的各位同学都全部投入,由于我们是第一次做课程设计,所以在其中含有一些问题,望各位教师批评指正。参考文献标注要用号,不要用()二、需求分析(1)课程设计题目
5、这一组的课程设计题目是用哈希表建立通讯录,并实现语言选单、创建、修改、查询、删除、文件的操作等。(2) 课程设计的目的掌握数据结构的根底技术,学会分析研究计算机加工的数据结构的特性,以便应用涉与的数据选择适当的逻辑结构、存储结构与其相应的算法,应用相关知设计设散列表实现查找系统。(3) 课程设计的要求【根本要求】 设每个记录有如下数据项:、用户名、地址; 从键盘输入各记录,分别以为关键字建立散列表; 采用二次探测再散列法解决冲突;查找并显示给定的记录; 通讯录信息文件保存; 要求人机界面友好,使用图形化界面;【选做内容】 系统功能的完善;设计不同的散列函数,比拟冲突率;在散列函数确定的前提下,
6、尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。 使用汉字显示。(4) 课程设计的主要思想课程设计中,通过不同的选择输入,实现不同的功能。有语言提示,它是通过不同的输入选择不同的语言。在通信录的创建中,把输入的信息保存在一个数组里,通过输入的,将其转化为数据,通过取余,找到它在哈希表的位置,如果位置冲突,就用二次探测处理。在查找中,通过输入的,调用哈希表寻找它在哈希表的位置,并把它输出。同样,修改于删除都是通过同样的的道理找到它在哈希表中的位置。在修改的时候,通过不同的修改选单实现不同的修改,在删除的时候,找到它的位置,在输出的的时候不输出,其实它并没有真正意义的被删除。三、概要设计(
7、1)流程图概括图通过得到不同的字符,实现不同的操作语言选单,并返回主函数创建通讯录,用哈希表实现,并返回主函数查找操作,并返回主函数删除某人的信息,并返回主函数修改某人的信息,并返回主函数显示通讯录中所有的信息,并返回主函数退出整个程序文件的存于读,并返回主函数图 1 概括图创建图 2 创建的流程图查找图 3 查找的流程图修改图4 修改的流程图删除图 5 删除的流程图(2)设计方法与原理主函数里,对不同的子函数,通过的到的不同字符对其进展调用。在建立通讯录中,用了哈希表的建立,在哈希表中,是将字符型数字转化为整形数据,并对哈希表的原有长度取余得到存储的位置,而得到的位置可能已被使用,故有调用了
8、二次哈希,并以最后处理的下标是否为非负,来决定是存储还是不存储。,而在下面的查询、删除、修改中,都是调用哈希表,找到它在哈希表中的位置来进展不同的操作。其中,在删除时,用了一个全局变量来存储要删除的位置的下标,在输出的时候不将其输出,而真正意义上,它并没有从保存的位置删除。在修改中,通过选择不同。来修改不同的信息。这个设计,主要就是对哈希表的调用与冲突的处理。四、详细内容程序代码#include#include#include#include /为了使用getch()方法#include#define MAXSIZE 200 /薄记录数量 #define MAX_SIZE 20 /人名的最大长
9、度#define HASHSIZE 67 /定义表长 #define LEN sizeof(HashTable)typedef int Status;typedef char FRIMAX_SIZE;int ss = 201; /用于帮助删除typedef struct /记录FRI name; FRI tel; FRI add;Record;typedef struct /哈希表Record *elemHASHSIZE; /数据元素存储基址 int count; /当前数据元素个数 int size; /最大容量HashTable;void SystemTime() /显示系统时间SYSTE
10、MTIME sys; GetLocalTime( &sys );printf(%4d/%02d/%02dn%02d:%02d:%02d.%03d,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds); void PR1()printf(tt* * * * * * * * * * * * * * * * * * * * * * * *n);SystemTime();printf(ttt通讯录操作的目录nn);printf(tt* * * * * * * * * * * * * * *
11、 * * * * * * * * *nn);void PR11()printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);printf(tttDirectories operation directorynn);printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR2()printf(t按a键,显示语言提示选单tt); printf(按b键,创建新的通讯录nn); printf(t按c键,在通信录的末尾写入新的信息tt); printf(按d键,查询某
12、人的信息nn); printf(t按e键,修改某人的信息tt); printf(按f键,删除某人的信息nn); printf(t按g键,显示通讯录中的所有记录tt);printf(按h键,退出选单nn);printf(t按i键,保存通讯录中的所有记录到指定文件中nn); printf(t按j键,从指定文件中读取通讯录中的记录n);printf(n友情提示:nt先建立方可进展查找、修改、删除、显示,在从文件读取前,应先存入文件nn);printf(t);void PR22()printf(tPressing a key, Language menunn); printf(tPressing b
13、key,Create a new address booknn); printf(tPressing c key,The end of the munication record to write a new ntinformationnn); printf(tPressing d key,Inquires the information. Someonenn); printf(tPressing e key,Modify someones informationnn); printf(tPressing f key,Remove someones informationnn); printf
14、(tPressing g key,All the records show directoriesnn);printf(tPressing h key,Exit menunn);printf(tPressing i key,Save all the records to the specified directory filenn); printf(tPressing j key,Read directories from a specified file record innn);printf(nHelpful hints:ntTo create can search, modify, de
15、lete, display,in read from the file,);printf(ntshould first before deposit filesnn);printf(t);void PR3()printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n);SystemTime();printf(ttt创建通讯录nn);printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR4(int i)printf(ntt* * * * * * * * * *
16、 * * * * * * * * * * * * * *n);SystemTime();printf(ttt查询某人的信息nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR5()printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n);SystemTime();printf(ttt修改某人的信息nn);printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR6()
17、printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n);SystemTime();printf(tttt删除某人的信息nn);printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR7()printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n);SystemTime();printf(ttt 在通信录的末尾写入新的信息nn);printf(tt* * * * * * * * * * * * *
18、 * * * * * * * * * * *nn);void PR8()printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n);SystemTime();printf(ttt通讯录中已存信息nn); printf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void PR9()printf(ntt* * * * * * * * * * * * * * * * * * * * * * * *n);SystemTime();printf(ttt从文件中读取结果nn); pr
19、intf(tt* * * * * * * * * * * * * * * * * * * * * * * *nn);void Menu()system(cls);int n;printf(nnnnnnnnnttt输入 1汉语、 2英语 选择语言: );scanf(%d,&n);system(cls);if(n = 1)PR1();PR2();if(n = 2)PR11();PR22();int NUM_BER = 0;int collision(int p,int &c)int a,pp;a = c/2+1;while(a0)return pp;elsea = c/2+1;elsepp = (
20、p -2*a)%HASHSIZE;c+;if(pp0)return pp;elsea = c/2+1;return -1;int HASH(FRI te) /哈希函数int m;long n;n = atoi(te);m = n%HASHSIZE;return m;void Append() /写入后继内容system(cls);FILE *fp;FRI pa;PR7();if(fp = fopen(D:wo.txt,ab+) =NULL)printf(tFile open erroe!);printf(nt输入追加的内容: );gets(pa);fwrite(pa,sizeof(FRI),1
21、,fp);fclose(fp);printf(nnntt按 Esc 键,返回主菜单);void CreateHash(HashTable *H,Record *a) /以为关键字/SystemTime();int i,c,p = -1,pp;for(i=0;ielempp!=NULL)pp = collision(p,c);if(ppelempp = &(ai);H-count+;printf(nttt建表完成!nntt散列表的容量为 %d ,当前容量为 %d ,HASHSIZE,H-count);void getin(Record *a,HashTable *H) /键盘输入个人的信息sys
22、tem(cls);PR3();printf(t输入要添加的个数: );scanf(%d,&NUM_BER);int i;for(i=0;ielempp!=NULL & bj(tel,H-elempp-tel) = 0)pp = collision(p,c);if(H-elempp!=NULL & bj(tel,H-elempp-tel) = 1)printf(nttt查找成功nn);printf(t某某: %snnt: %snnt : %sn,H-elempp-name,H-elempp-tel,H-elempp-add);elseprintf(nt此人不存在,失败!n);printf(nt按
23、 Esc 键,返回主菜单);void Alter(HashTable* H,int &c) /修改system(cls);PR5();fflush(stdin);FRI tel;FRI gai;int p,pp,i;printf(nt输入要修改信息的: ); gets(tel); p = HASH(tel);pp = p;while(H-elempp!=NULL & bj(tel,H-elempp-tel) = 0)pp = collision(p,c);if(H-elempp!=NULL & bj(tel,H-elempp-tel) = 1)printf(nt输入1 , 2来选择修改项【1:
24、修改某某,2:修改地址】: );scanf(%d,&i);switch(i)case 1 :fflush(stdin); printf(nt输入要修改后的某某: ); gets(gai);strcpy(H-elempp-name,gai);break;case 2:fflush(stdin);printf(nt输入要修改后的地址: ); gets(gai);strcpy(H-elempp-add,gai);break;default:printf(nt输入错误!);elseprintf(nt此人不存在,失败!n);printf(nnnt按 Esc 键,返回主菜单);void Delete(Ha
25、shTable *&H,int c,Record *a) /删除system(cls);PR6();fflush(stdin);FRI tel;printf(nnt输入要删除的: );gets(tel);int i = 0; while(strcmp(ai.tel,tel)!=0)i+;ss = i; int p,pp;p = HASH(tel);pp = p;while(H-elempp!=NULL & bj(tel,H-elempp-tel) = 0)pp = collision(p,c);if(H-elempp!=NULL & bj(tel,H-elempp-tel) = 1)H-elempp = NULL;H-count -; else printf(“nntt对不起,无此人信息!nn);printf(nt按 Esc 键,返回主菜单);void List(Record *a,HashTable *H) /输出system(cls);PR8();int i;printf(t
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1