数据结构课程设计哈希表设计问题复习过程
《数据结构》课程设计-哈希表设计
目录课程设计任务书 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值之和作为关键码,然后输出相应的查找长度。
数据结构课程设计-哈希表及其应用
学号:************课程设计题目哈希表及其应用教学院计算机学院专业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.培养学生综合运用所学知识独立完成程序课题的能力。
数据结构课程设计_哈希表实验报告
福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级: 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。
数据结构设计报告--哈希查找与实现
数据结构课程设计报告书班级BX1001专业计算机科学与技术学号101003020139姓名赵冠博课题描述:哈希表的查找与实现分析1、 需求分析:本次课程设计需要实现哈希表的建立和查找,具体内容如下:建立哈希函数,从而根据用户输入的数据元素个数和各元素的值建立哈希表,即数据的添加和存储。
如果输入的元素个数超出规定范围,则打印出错信息,并提示重新输入信息。
哈希表建立好之后,用户可以输入想要查找的值,屏幕显示相应信息。
如果存在此值,屏幕显示该值信息;如果不存在,则显示该值不存在;如果想退出系统,则按提示输入命令。
2、 总体结构设计:1> 一个哈希表结构hashtable ,2>一个main ()主函数(完成数据输入和函数调用)、3>五个功能函数:Initialhash ()//初始化哈希表Printhash ()//输出哈希表的所有元素及其位置Searchhash ()//查找哈希表inserthash ()//查找哈希表deletehash ()//查找哈希表3、 各子模块设计:构成如下图所示:【设计思想】选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;查找时,由同一个函数对给定值kx 计算地址,将kx 与地址单元中元素关键字进行比较,确定查找是否成功,这就是哈希方法。
哈希方法中使用的转换函数称为Searchhash () Printhash () Initalhash() inserthash () deletehash哈希查找程序main()哈希函数。
程序首先通过插入操作建立哈希表,接着显示数据,然后运用哈希查找找到数据,如没有找到则显示查找错误,找到则显示查找成功。
4、编程实现:【实验程序主要代码】:#define MAXSIZE 12 //哈希表的最大容量,与所采用的哈希函数有关enum BOOL{False,True};enum HAVEORNOT{NULLKEY,HAVEKEY,DELKEY};//哈希表元素的三种状态,没有记录、有记录、有过记录但已被删除typedef struct //定义哈希表的结构{ int elem[MAXSIZE]; //数据元素体HAVEORNOT elemflag[MAXSIZE];//元素状态,没有记录、有记录、有过记录但已被删除 int count; // 哈希表中当前元素的个数}HashTable;typedef struct{ int keynum; // 记录的数据域,只有关键字一项}Record;void InitialHash(HashTable&); // 初始化哈希表void PrintHash(HashTable); // 显示哈希表中的所有元素BOOL SearchHash(HashTable,int,int&); // 在哈希表中查找元素BOOL InsertHash(HashTable&,Record); // 在哈希表中插入元素BOOL DeleteHash(HashTable&,Record); // 在哈希表中删除元素int Hash(int); // 哈希函数void main(){ HashTable H; // 声明哈希表Hchar ch,j='y';int position,n,k;Record R;BOOL temp;InitialHash(H);while(j!='n'){ printf("\n\t 哈希查找 ");printf("\n\t**************************************");printf("\n\t* 1-----建表 *");printf("\n\t* 2-----显示 *");printf("\n\t* 3-----查找 *");printf("\n\t* 4-----插入 *");printf("\n\t* 5-----删除 *");printf("\n\t* 0-----退出 *");printf("\n\t**************************************");printf("\n\n\t请输入菜单号:");scanf(" %c",&ch); // 输入操作选项switch(ch){ case '1':printf("\n请输入元素个数(<10): ");scanf("%d",&n);printf("\n");for( k=0;k<n;k++){ printf("请输入第%3d个整数: ",k+1);scanf("%d",&R.keynum); // 输入要插入的记录temp=InsertHash(H,R);};break;case '2':if(H.count) PrintHash(H); // 哈希表不空else printf("\n散列表为空表!\n");break;case '3':if(!H.count) printf("\n散列表为空表!\n"); // 哈希表空else{ printf("\n请你输入要查找元素(int) :");scanf("%d",&R.keynum); // 输入待查记录的关键字temp=SearchHash(H,R.keynum,position);// temp=True:记录查找成功;temp=False:没有找到待查记录if(temp) printf("\n查找成功该元素位置是 %d\n",position); else printf("\n本散列表没有该元素!\n");}break;case '4':if(H.count==MAXSIZE) // 哈希表已满 { printf("\n散列表已经满!\n");break; }printf("\n请输入要插入元素(int):");scanf("%d",&R.keynum); // 输入要插入的记录 temp=InsertHash(H,R);// temp=True:记录插入成功;temp=False:已存在关键字相同的记录if(temp) printf("\n元素插入成功!\n");else printf("\n元素插入失败,相同元素本散列表已经存在!\n"); break;case '5':printf("\n请你输入要删除元素(int):");scanf("%d",&R.keynum); // 输入要删除记录的关键字temp=DeleteHash(H,R);// temp=True:记录删除成功;temp=False:待删记录不存在if(temp) printf("\n删除成功!\n");else printf("\n删除元素不在散列表中!\n");break;default: j='n';}}printf("\n\t欢迎再次使用本程序,再见!\n");}void InitialHash(HashTable &H) // 哈希表初始化{ int i;H.count=0;for(i=0;i<MAXSIZE;i++) H.elemflag[i]=NULLKEY;}void PrintHash(HashTable H) // 显示哈希表所有元素及其所在位置{ int i;for(i=0;i<MAXSIZE;i++) printf("%-4d",i); // 显示哈希表中记录所在位置printf("\n");for(i=0;i<MAXSIZE;i++) // 显示哈希表中记录值if(H.elemflag[i]==HAVEKEY) printf("%-4d",H.elem[i]);else printf("%4c",' ');printf("\ncount:%d\n",H.count); // 显示哈希表当前记录数}BOOL SearchHash(HashTable H,int k,int &p){ // 在开放定址哈希表H中查找关键字为k的数据元素,若查找成功,以p指示待查//数据元素在表中的位置,并返回True;否则,以p指示插入位置,并返回Falseint p1;p1=p=Hash(k); // 求得哈希地址while(H.elemflag[p]==HAVEKEY&&k!=H.elem[p]) //该位置填有记录并且关键字不相等 { p++; // 冲突处理方法:线性探测再散列if(p>=MAXSIZE) p=p%MAXSIZE; // 循环搜索if(p==p1) return False; // 整个表已搜索完,没有找到待查元素 }if(k==H.elem[p]&&H.elemflag[p]==HAVEKEY) // 查找成功,p指示待查元素位置 return True;else return False; // 查找不成功}BOOL InsertHash(HashTable &H,Record e){ // 查找不成功时插入元素e到开放定址哈希表H中,并返回True,否则返回False int p;if(SearchHash(H,e.keynum,p)) // 表中已有与e有相同关键字的元素return False;else{ H.elemflag[p]=HAVEKEY; // 设置标志为HAVEKEY,表示该位置已有记录H.elem[p]=e.keynum; // 插入记录H.count++; // 哈希表当前长度加一return True;}}BOOL DeleteHash(HashTable &H,Record e){ // 在查找成功时删除待删元素e,并返回True,否则返回Falseint p;if(!SearchHash(H,e.keynum,p)) return False; // 表中不存在待删元素else{ H.elemflag[p]=DELKEY; // 设置标志为DELKEY,表明该元素已被删除 H.count--; // 哈希表当前长度减一return True;}}int Hash(int kn){ return (kn%11); } // 哈希函数:H(key)=key MOD 115、测试结果:【程序运行结果】建表和显示:查找:插入:删除:通过分析输入数据和运行结果,证明程序顺利完成实验内容和要求。
哈希表--数据结构课设
洛阳理工学院课程设计说明书课程名称数据结构设计课题哈希表的设计与实现专业班级学号姓名完成日期 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分别以用户名和电话号码为关键字进行查找。
最后,输出查找不成功的平均查找长度。
在本程序当中用了两种解决冲突的办法,分别是线性探测再散列和再哈希法。
哈希函数构造方法是,除留余数法。
数据结构哈希表设计
数据结构哈希表设计数据结构哈希表设计====================章节一:引言---------------------在计算机科学中,哈希表(Hash Table)是一种用于实现关联数组(Associative Array)或映射(Map)的数据结构。
哈希表通过使用哈希函数将键(Key)映射到存储位置(数组索引)来实现快速的插入、删除和查找操作。
本文将详细介绍哈希表的设计原理和实现方法。
章节二:哈希函数---------------------哈希函数是哈希表的核心,它将任意大小的输入映射为固定大小的输出,通常是一个整数。
好的哈希函数应该具有以下特性:1.一致性:对于相同的输入,始终返回相同的输出。
2.均匀性:哈希函数应将输入均匀地映射到输出范围内。
3.支持快速计算:哈希函数应该能够在常数时间内计算出哈希值。
章节三:哈希冲突解决方法------------------------由于哈希函数的输出空间通常较小,不同的键可能会被映射到相同的存储位置上,这就导致了哈希冲突。
在实际应用中,哈希冲突是不可避免的。
为了解决哈希冲突,常用的方法有以下几种:1.法(Chning):将冲突的键值对存储在同一个链表中,在插入和查找时顺序遍历链表即可。
2.开放地质法(Open Addressing):将冲突的键值对存储在哈希表中的其他位置,通过一定的规则(如线性探测、二次探测等)查找下一个可用的位置。
3.建立更好的哈希函数:合适的哈希函数能够尽量减少冲突的概率。
章节四:哈希表的实现--------------------在实现哈希表时,我们需要考虑以下几个重要的方面:1.哈希函数的选择:选择合适的哈希函数是保证哈希表性能的关键。
不同的键类型可能需要不同的哈希函数。
2.存储结构的选择:可以使用数组、链表、红黑树等数据结构来存储哈希表中的键值对。
3.动态扩容:当哈希表中的数据量增加时,需要及时进行扩容操作,以保证哈希表的性能。
数据结构课程设计_哈希表实验报告
福建工程学院课程设计课程:算法与数据结构题目:哈希表专业:网络工程班级: 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。
数据结构哈希表设计
数据结构哈希表设计1.引言哈希表(Hash Table)是一种常用的数据结构,用于快速存储和检索数据。
它通过将键(Key)映射到值(Value)来实现高效的数据存储和查找。
本文将介绍哈希表的设计原理和实现方法,以及一些常见的应用场景。
2.哈希函数的选择哈希函数是实现哈希表的关键,它将键映射到哈希值。
一个好的哈希函数应当具有以下特点:●均匀性:对于任意的输入,哈希函数应该能够将其均匀地映射到哈希表的各个位置,避免产生过多的冲突。
●高效性:哈希函数应当能够在常数时间内计算出哈希值,避免影响哈希表的性能。
●低冲突性:哈希函数应当能够尽可能少的冲突,即不同的键经过哈希函数计算得到相同的哈希值的概率应当很低。
3.冲突解决方法由于哈希函数的有限性,不同的键可能会产生相同的哈希值,这种情况称为冲突。
常见的冲突解决方法有以下几种:●链地质法(Chning):将哈希表的每个位置引入链表,当多个键映射到相同的位置时,将它们存储在链表中。
●开放寻址法(Open Addressing):当发生冲突时,通过一定的方法在哈希表中寻找下一个可用的位置,直到找到一个空位置或者遍历完整个哈希表。
●再哈希法(Rehashing):当发生冲突时,通过应用另一个哈希函数来计算出一个新的哈希值,以此来解决冲突。
4.哈希表的操作哈希表支持以下几种操作:●插入(Insert):将一个键值对插入到哈希表中。
●删除(Delete):从哈希表中删除指定的键值对。
●查找(Search):根据给定的键,在哈希表中查找对应的值。
●更新(Update):根据给定的键,更新哈希表中对应的值。
5.哈希表的应用哈希表广泛应用于各种场景,例如:●缓存:哈希表可以用于实现高效的缓存系统,根据请求的键值对快速查找到对应的数据。
●字典:哈希表可以被用作实现字典,将单词与其定义相关联。
●数据库索引:哈希表可以用于构建数据库的索引,提高数据的检索性能。
6.总结哈希表是一种高效的数据结构,通过将键映射到值来实现快速的数据存储和检索。
数据结构哈希表设计
数据结构哈希表设计数据结构哈希表设计一、概述哈希表是一种在计算机科学中广泛应用的数据结构,它通过将关键字映射到哈希表中的位置来实现快速的查找、插入和删除操作。
本文将详细介绍哈希表的设计原理、实现方法和常见应用场景。
二、设计原理1、哈希函数的选择哈希函数是哈希表的关键,它将关键字映射到哈希表中的位置。
一个好的哈希函数能够尽可能地将关键字均匀地分布在哈希表中,减少冲突。
2、冲突解决方法由于哈希函数的输出值的范围通常远小于关键字的范围,不可避免地会出现冲突。
冲突解决方法主要有开放定址法、链地质法和再哈希法。
3、动态扩容在使用哈希表的过程中,可能会发生数据增加的情况。
为了保持哈希表的性能,需要进行动态扩容,重新计算哈希函数,并将原有数据重新散列。
三、实现方法1、哈希表的数据结构哈希表通常由一个数组和一个哈希函数组成。
数组的大小为哈希表的容量,每个位置存储一个链表或其他数据结构。
2、哈希函数的实现哈希函数的实现可以基于关键字的特征进行设计,例如,对于字符串关键字,可以使用字符的ASCII码值的和或乘积作为哈希函数。
3、冲突解决方法的实现- 开放定址法:当发生冲突时,依次查找下一个空位置,并将数据插入其中。
- 链地质法:每个位置存储一个链表,发生冲突时,将数据插入到链表的末尾。
- 再哈希法:使用不同的哈希函数重新计算哈希值,直到找到一个空位置。
四、常见应用场景1、数据库索引哈希表可以用于实现数据库的索引功能,快速定位到存储的数据。
2、缓存实现哈希表可以作为缓存系统的核心数据结构,用于存储缓存的键值对。
3、字典实现哈希表可以用于实现字典,将单词作为键进行存储和查询。
附件:无附件。
法律名词及注释:1、哈希表:是一种数据结构,它通过哈希函数将关键字映射到哈希表中的位置,实现快速的查找、插入和删除操作。
2、关键字:在哈希表中与数据相关联的标识符或键。
关键字是哈希函数的输入。
3、哈希函数:将关键字映射到哈希表中位置的函数。
(完整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一、课程目标知识目标:1. 理解哈希表的基本概念,掌握哈希表的构建、插入、删除等操作方法;2. 了解哈希冲突的类型及解决方法,掌握线性探查法、链地址法等常见解决策略;3. 掌握哈希表的平均查找长度及其计算方法,了解影响哈希表性能的因素。
技能目标:1. 能够运用哈希表解决实际问题,如查找、统计等;2. 能够编写简单的哈希表程序,实现基本操作,并进行性能分析;3. 能够分析哈希表在不同应用场景下的优缺点,选择合适的哈希策略。
情感态度价值观目标:1. 培养学生主动探索、积极思考的学习态度,增强对数据结构知识的好奇心和求知欲;2. 培养学生的团队合作意识,学会在团队中分工协作,共同解决问题;3. 引导学生认识到数据结构在实际应用中的价值,激发学生将所学知识应用于实际问题的兴趣。
分析课程性质、学生特点和教学要求:1. 本课程为高中信息技术学科的数据结构部分,旨在让学生掌握哈希表的基本知识和应用;2. 学生已具备一定的编程基础和逻辑思维能力,对数据结构有一定了解;3. 教学要求注重理论与实践相结合,强调学生的动手实践能力和问题解决能力的培养。
二、教学内容1. 哈希表的基本概念与性质- 哈希表的定义、作用及适用场景;- 哈希表的存储结构及关键术语介绍;- 哈希表的平均查找长度、时间复杂度分析。
2. 哈希函数的构造方法- 直接定址法、数字分析法、平方取中法等常见哈希函数构造方法;- 哈希函数的评估标准:均匀性、冲突率、计算复杂度等。
3. 哈希冲突的解决策略- 线性探查法、二次探查法、链地址法等解决策略;- 各类解决策略的优缺点及适用场景。
4. 哈希表的构建与操作- 哈希表的初始化、插入、删除、查找等基本操作;- 哈希表操作程序的编写与性能分析。
5. 哈希表的应用实例- 案例分析:单词统计、查找重复元素等;- 学生实践:设计并实现一个简单的哈希表程序。
教学内容安排与进度:第一课时:哈希表基本概念与性质、哈希函数构造方法;第二课时:哈希冲突解决策略、哈希表构建与操作;第三课时:哈希表应用实例分析、学生实践。
数据结构哈希表设计
数据结构哈希表设计在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问、操作和管理数据。
哈希表(Hash Table)作为一种重要的数据结构,在许多应用中都发挥着关键作用。
它以其高效的查找、插入和删除操作,成为了处理大量数据时的得力工具。
那么,什么是哈希表呢?简单来说,哈希表是一种根据关键码值(Key)而直接进行访问的数据结构。
通过一个哈希函数(Hash Function),将关键码映射到表中的一个位置来访问记录,以加快查找的速度。
要设计一个有效的哈希表,首先需要考虑的是哈希函数的选择。
一个好的哈希函数应该尽可能地将不同的关键码值均匀地分布在哈希表的存储空间中,以减少冲突的发生。
常见的哈希函数设计方法包括直接定址法、数字分析法、平方取中法、折叠法、除留余数法等。
以除留余数法为例,假设我们要存储的关键码值是整数,哈希表的长度为 m,那么哈希函数可以设计为 h(key) = key % m 。
也就是说,用关键码值除以 m 取余数,得到的结果就是在哈希表中的存储位置。
然而,即使选择了一个较好的哈希函数,冲突仍然可能会发生。
这是因为哈希函数将一个无限的关键码值集合映射到一个有限的存储空间中,必然会存在多个关键码值被映射到相同位置的情况。
当发生冲突时,就需要采用合适的冲突解决方法。
常见的冲突解决方法有开放定址法和链地址法。
开放定址法是指当发生冲突时,按照某种探查方式在哈希表中寻找下一个空闲的位置来存储冲突的元素。
常见的探查方法有线性探查、二次探查和双重探查等。
链地址法则是将所有哈希地址相同的元素构成一个单链表,并将单链表的头指针存储在哈希表的对应位置。
当查找元素时,首先通过哈希函数计算出哈希地址,然后在对应的单链表中进行查找。
在实际设计哈希表时,还需要考虑哈希表的装填因子(Load Factor)。
装填因子是指哈希表中已存储的元素个数与哈希表的长度之比。
装填因子越大,冲突发生的可能性就越高;装填因子越小,虽然冲突减少,但会浪费更多的存储空间。
数据结构哈希表如何设计和实现_华清远见
数据结构哈希表如何设计和实现在我们说到数据结构哈希表如何设计和实现之前,我觉得有必要给初出茅庐的新手重新再讲解一下,何为哈希表。
哈希表,又叫散列表。
是根据关键码值(Key value)而直接进行访问的数据结构。
也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
数据结构一直都是软件工程师必备技能之一,也是难点之一。
数据结构其实是数据存储结构,它采用不同的存储方式和逻辑思路,实现各种数据和数据之间的关联,并且加上对应的算法,来解决问题。
哈希表(散列表)是数据结构中一种散列存储方式,优点在于关键值key可以通过指定的算法直接得到数据的存储位置hash(key),这样一来不需要轮询,时间复杂度大大的降低。
从而,哈希表满足了对数据操作高效率的要求。
但是,哈希表也不是全能的,它的使用有一定的局限性。
下面我们来介绍一下哈希表如何设计和实现。
一、哈希表的设计哈希表主要是确认关键值key和关键值存储位置hash(key)之间的具体关联算法。
并且保证最少的哈希冲突(多个不同数据通过算法得到存储位置相同,这时就是哈希冲突)产生。
常见的哈希表的设置方法如下:(1)直接定址法:最直接的构造哈希表的方法,存储位置是通过线性函数得到的:hash(key) = a * key + b {a、b为常数}特点:这样得到的 hash(key) 和 key之间一一对应,一般不会产生冲突;空间:这的哈希表要求地址空间大小与key集合大小相同;应用:一般用于有序的key集合,例如各种编号。
(2)数字分析法:分析已有数据的特点,选择尽量冲突少的数字来构造哈希表。
特点:数据是多位组成,数据和数据之间有相同的也有不同的,根据数据中每位的分布特点,选取若干位作为哈希表地址。
《哈希表》课程设计报告
《哈希表》课程设计报告数据结构散列表(哈希表)课程设计报告及源代码《哈希表的操作》设计报告一目的通过此次课程设计,让学生充分掌握对哈希表的有关操作,例如除留余数法的运用,处理冲突的三个办法:线性探测再散列,二次探测再散列,连地址法等。
加深学生对于哈希表这种独特存储方式(区别于线性存储和链式存储)的理解,和几种算法之间的优越性的体会。
二需求分析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() 置空哈希表函数,类成员感谢您的阅读,祝您生活愉快。
哈希表设计与实现数据结构课程设计
课程名称:数据结构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前言在信息化时代的今天,计算机技术已经是发展到一个很可观的地步了,特别是面向窗口的操作系统的出现,使得程序设计更加的容易了。
数据结构课程设计哈希表设计问题
资料范本本资料为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版,《数据结构》实验五哈希表
实验五查找一、实验目的(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;}四、测试结果(程序运行结果采用截图的方式打印)五、实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计哈希表设计问题目录1 前言 (1)2 需求分析 (1)2.1 任务和要求 (1)2.2 运行环境 (1)2.3 开发工具 (1)3 分析和设计 (2)3.1 系统分析及设计思路 (2)3.2 主要数据结构及算法 (2)3.3 函数流程图 (2)(1)哈希表的创建及初始化流程图 (2)5 课程设计总结 (13)5.1 程序运行结果或预期运行结果 (13)说明:输入的数为30个姓的拼音,查找的为“pan”,输出的如上图所示。
(14)5.2 设计结论 (15)参考文献 (15)致谢 (15)1 前言从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。
在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C语言基本相同。
学习、掌握C语言是每一个计算机技术人员的基本功之一。
根据本次课程设计的要求,我设计小组将编写一个C语言程序来处理哈希表问题,通过这个程序,将针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
2 需求分析2.1 任务和要求针对自己的班集体中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
要求:假设人名为中国姓名的汉语拼音形式。
待填入哈希表的人名共有30个,取平均查找长度的上限为2。
哈希函数用除留余数法构造,用链表法处理冲突。
2.2 运行环境(1)WINDOWS2000/XP系统(2)Visual C++ 6.0编译环境或TC编译环境2.3 开发工具C语言3 分析和设计3.1 系统分析及设计思路(1)创建哈希表(2)姓名(结构体数组)初始化(1)用除留余数法构建哈希函数(2)用链表法处理冲突(3)查找哈希表在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度(4) 显示哈希表显示哈希表的的格式:3.2 主要数据结构及算法定义结构体typedef struct hashtable创建哈希表定义函数Hash_Init(HashTable ht)来对哈希表初始化定义函数Hash_Insert(HashTable ht, Node *node)来为哈希表分配地址定义函数Hash_Init(ht)输入30个名字定义函数Hash_Create(HashTable ht)来求哈希表长度定义函数hash_output(HashTable h)来输出哈希表定义函数Hash_Link()构造链表函数定义函数int hash_search(int h[],int key)查找输入的名字3.3 函数流程图(1)哈希表的创建及初始化流程图图3.1哈希表的创造及初始化流程图(2)创建哈希表链表的流程图图3.2创造哈希表链表的流程图(3)查找输入数据的流程图图3.3查找输入数据的流程图4 具体代码实现#include <stdio.h>#include <string.h>#include <stdlib.h>#include <conio.h>#define P 30 /*除数余留法中的除数*/#define NULLKEY 0#define MAX 30 /*人名个数*/#define hashlen 30 /*哈希表长度*/int sum=0,k=0;typedef struct Node /*哈希表结构体*/{char key_code[10]; /*哈希表地址*/struct Node *next;}Node;typedef struct hashtable /*创建哈希表*/{int key;struct Node *next;}HashTable[MAX];int Hash(int key){int mode = key % P; /*除留余数法得到的余数*/ return mode;}void Hash_Init(HashTable ht) /*哈希表初始化*/ {int i;for(i = 0; i < MAX; i++){ht[i].key = NULLKEY;ht[i].next = NULL;}}int CharToInt(char str[]){return str[0]+str[1]+str[2];}int Hash_Insert(HashTable ht, Node *node) /*为哈希表分配地址*/ {int key = Hash(CharToInt(node->key_code));Node *p;p=(Node*)malloc(sizeof(Node));if(ht[key].key == NULLKEY){ht[key].key = key;ht[key].next = node;k++;}else if(ht[key].key == key){p = ht[key].next;k++;while(p->next!= NULL){p = p->next;k++;}p->next = node;k++;}return 1;}Node* Hash_Search(HashTable ht, int key) /*查找函数*/ {int p0 = Hash(key);if(ht[p0].key == NULLKEY){sum++;return NULL;}else if(ht[p0].key == p0){Node *p = ht[p0].next;while(p != NULL){if(CharToInt(p->key_code) == key){ sum++;return p;}p = p->next;sum++;}}return NULL;}int Hash_Create(HashTable ht) /*哈希表长度*/{int i;Node *node;Hash_Init(ht);printf("请输入姓名:"); /*输入30个姓名*/for(i=0;i<30;i++){node = (Node *)malloc(sizeof(Node));scanf("%s",node->key_code);node->next = NULL;Hash_Insert(ht, node);}printf("\nCreate Successfully!\n");return 1;}int hash_output(HashTable h) /*哈希表的输出部分*/ {Node *a;int i,j,count2=0;a=(Node*)malloc(sizeof(Node));j=0;for(i=0;i<hashlen;i++){printf("%4d",i);printf("%4d",h[i].key);if(h[i].next!=0)count2++;j=1;a=h[i].next;while(a){printf("->%s",(*a).key_code);a=(*a).next;j++;count2+=j;}printf("\n");}return count2;}void Hash_Link() /*链表法构造函数*/{int key;int i;Node *node;HashTable ht;Hash_Create(ht);hash_output( ht);printf("count=%d\n",k); /*查找总长度*/printf("ASL=%d/8\n",k); /*平均查找长度*/ printf("请输入要查找的数据:"); /*输入查找的姓名*/ scanf("%s",&key);node = Hash_Search(ht, key);printf("查找次数:%d\n",sum);if(node != NULL)printf("查找成功!");elseprintf("查找不成功!");}void hash_create(int h[],int status[],int data){int address;int di;address=data%P;if(status[address]==0){h[address]=data;status[address]=1;}else{for(di=1;di<=hashlen-1;di++){address=((data%P)+di)%hashlen;if(status[address]==0){h[address]=data;status[address]=1;break;}}}return ;}int hash_search(int h[],int key){ int address, di;address=key % P;if(h[address]==key) /*哈希表中元素与查找元素是否相等*/return 1;else{for(di=1;di<=hashlen-1;di++)/*哈希表中元素与查找元素不相等,查找下一元素*/{address=((key%P)+di)%hashlen;if(h[address]==key){return di+1;break;}}}if(di>=hashlen)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();}5 课程设计总结5.1 程序运行结果或预期运行结果图5.1程序运行结果1图5.2程序运行结果2说明:输入的数为30个姓的拼音,查找的为“pan”,输出的如上图所示。
5.2 设计结论通过这次课程设计,我了解到了许多自身的不足,有很多学习过的知识,在学过之后并没有反复的操作和复习,以为课堂上听懂就行了,在这课程设计中,这些不足就显现了出来,导致经常要翻书,查找一些以为弄懂的问题,这次我了解到了,学习不仅仅是课堂上听讲,还要课后复习和操作。