网站大量收购独家精品文档,联系QQ:2885784924

数据结构实验十三.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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;

文档评论(0)

yaobanwd + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档