- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构实验十三
一、实验目的
1.掌握什么是哈希表和哈希函数。
2.掌握哈希表的构建和哈希查找。
二、实验环境
1.硬件:每个学生需配备计算机一台。操作系统:DOS或Windows:
2.软件:DOS或Windows操作系统+Turbo C;
三、实验要求
1.设计一个哈希表。哈希函数用除留余数法构造,用线性探测再散列处理冲突。
2.学生成绩报告单。任给任一学生学号即可打印出该生的成绩报告单。
3.学生学号可以不按照顺序。
四、实验内容
1.在自己的U盘的“姓名+学号”文件夹中创建“实验13”,本次实验的所有程序和数据都要求存储到本文件夹中。
2.现在某个学院有20名同学,每个同学记录包括:班级、学号、姓名和语文、数学、外语等三门课程成绩(学号为了2位整数)。
3.以学号为主关键字,用除留余数法构造哈希函数(请先考虑除数P的选择原则是什么?),用线性探测再散列处理冲突构建哈希表。
4.输入任何一个学生学号,输出该学生的信息。
5.说明线性探测再散列处理的优缺点,用链地址法在实现。
五、代码如下
#includestdio.h
#includestring.h
#includemalloc.h
#includestdlib.h
#define EQ(a,b) (a==b)
int hashsize[]={3,11,19,29,37};
//哈希表容量递增表,一个合适的素数序列,这里选择是三个元素,不做更多的纠缠
int m;//m的选择必须是不大于表长的最大素数
//数据元素定义
typedef struct {
int number;
char Class[10];
char name[10];
int chinese;
int math;
int english;
}student;
//哈希表
typedef struct{
student *elem; //数据元素存储基址,动态分配数组
int count; //当前数据元素的个数
int sizeindx; //当前的容量
}hashtable;
//hash函数
unsigned Hash(int k){
return k%m; //除留余数法,除以的是一个不大于表长最大素数
}
//增量序列函数
int d(int i){
return i;//线性探测再散列
}
//冲突处理方法
void ylx_collision(int k,int *p,int i){
*p=(Hash(k)+d(i))%m;
}
//初始化函数
void ylx_InitHashTabke(hashtable * H){
int i;
H-count=0;
H-sizeindx=0;
m=hashsize[0];
H-elem=(student*)malloc(m*sizeof(student)); //分配内存
if(!H-elem)
exit(0);
for(i=0;im;i++)
H-elem[i].number=0;//表示还未开始添加数据
}
//查找函数
int ylx_search(hashtable h,int num,int *p,int *c){
//在开放的哈希表中查找关键字为num的元素,假如成功,以p指示待查的数据元素
//在表中的位置,并且返回状态,否则以p指示插入的位置,c记录冲突的位置,以供插入的时候参考
*p=Hash(num);//求出哈希地址
while(h.elem[*p].number!=0!EQ(num,h.elem[*p].number)){//该位置有记录,并且不等于等待查数据
(*c)++;//冲突加一
if(*cm){
ylx_collision(num,p,*c);//求下一个探查地址
}else break;
}
if(EQ(num,h.elem[*p].number))
return 1;
else return 0;
}
//对函数需要声明,下面需要用到
void ylx_recreateHashTable(hashtable * h);
//插入函数,查找不成功,就插入元素到哈希表中,假如冲突过大,则重新建立哈希表
int ylx_InsertHash(hashtable *h,student e){
int p,c=0;
if(ylx_search(*h,e.number,p,c)){
return -1;
}
else if(chashsize[h-sizeindx]/2){
h-elem[p]=e;
++h-count;
您可能关注的文档
最近下载
- 一年级语文下册课件-口语交际:打电话-部编版(9)(共12张PPT)-语文一年级下册课件.ppt VIP
- Unit3LivingLegendsReadingandThinking教学设计高中英语人教版.docx VIP
- 一年级下册语文 口语交际 打电话 课件(共12张PPT).pptx VIP
- 党政领导干部选拔作用工作条例学习内容提纲.doc VIP
- DLT441-2004《火力发电厂高温高压蒸汽管道蠕变监督规程》.pdf VIP
- 五年级美术《为作文画插图》.ppt VIP
- 2026届新高考物理冲刺复习“配速法”解决带电粒子在复合场中的运动.pptx VIP
- 玉米期货分析报告.docx VIP
- 铁道工程技术论文-铁路路基边坡病害及处理措施.docx
- 2025年小学语文部编版五年级下册《选择题》专项练习题(共4组,附答案)(必考.pdf VIP
文档评论(0)