下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 #include #include #include /* malloc()等 */ #include /* int_max等 */ #include /* eof(=z或 f6),null */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ /* 函数结果状态代码 */ #define true 1 #define false 0 #define ok 1 #define error 0 #define infeasible -1/*
2、status是函数的类型 , 其值是函数结果状态代码,如ok等 */ #define nullkey 0 /* 0为无记录标志 */ #define n 10 /* 数据元素个数 */ typedef int keytype; /* 设关键字域为整型 */ typedef int status; typedef struct keytype key; int ord; elemtype; /* 数据元素类型 */ #define eq(a,b) (a)=(b) int hashsize=11,19,29,37; /* 哈希表容量递增表,一个合适的素数序列 */ int m=0; /* 哈希表表
3、长,全局变量 */ typedef struct elemtype *elem; /* 数据元素存储基址,动态分配数组 */ int count; /* 当前数据元素个数 */ int sizeindex; /* hashsizesizeindex为当前容量 */ hashtable; #define success 1 #define unsuccess 0 #define duplicate -1 status inithashtable(hashtable *h) /* 操作结果 : 构造一个空的哈希表 */ int i; (*h).count=0; /* 当前元素个数为0 */ (*h
4、).sizeindex=0; /* 初始存储容量为hashsize0 */ m=hashsize0; (*h).elem=(elemtype*)malloc(m*sizeof(elemtype); if(!(*h).elem) exit(overflow); /* 存储分配失败 */ for(i=0;im;i+) (*h).elemi.key=nullkey; /* 未填记录的标志 */ return ok; void destroyhashtable(hashtable *h) /* 初始条件 : 哈希表 h存在。操作结果: 销毁哈希表h */ free(*h).elem); (*h).el
5、em=null; (*h).count=0; (*h).sizeindex=0; unsigned hash(keytype k) /* 一个简单的哈希函数(m 为表长,全局变量) */ return k%m; void collision(int *p,int d) /* 线性探测再散列 */ /* 开放定址法处理冲突 */ *p=(*p+d)%m; status searchhash(hashtable h,keytype k,int *p,int *c) /* 在开放定址哈希表h中查找关键码为k的元素 , 若查找成功 , 以 p 指示待查数据 */ /* 元素在表中位置, 并返回 suc
6、cess; 否则 , 以 p 指示插入位置 , 并返回 unsuccess */ /* c用以计冲突次数,其初值置零,供建表插入时参考。*/ *p=hash(k); /* 求得哈希地址 */ while(h.elem*p.key!=nullkey&!eq(k,h.elem*p.key) /* 该位置中填有记录并且关键字不相等 */ (*c)+; if(*cm) collision(p,*c); /* 求得下一探查地址p */ else break; if eq(k,h.elem*p.key) return success; /* 查找成功, p 返回待查数据元素位置 */ else r
7、eturn unsuccess; /* 查找不成功 (h.elemp.key=nullkey),p 返回的是插入位置 */ status inserthash(hashtable *,elemtype); /* 对函数的声明 */ void recreatehashtable(hashtable *h) /* 重建哈希表 */ /* 重建哈希表 */ int i,count=(*h).count; elemtype *p,*elem=(elemtype*)malloc(count*sizeof(elemtype); p=elem; printf(重建哈希表 n); for(i=0;ikey!=
8、nullkey) /* 该单元有数据 */ *p+=*(*h).elem+i); (*h).count=0; (*h).sizeindex+; /* 增大存储容量 */ m=hashsize(*h).sizeindex; p=(elemtype*)realloc(*h).elem,m*sizeof(elemtype); if(!p) exit(overflow); /* 存储分配失败 */ (*h).elem=p; for(i=0;im;i+) (*h).elemi.key=nullkey; /* 未填记录的标志( 初始化 ) */ for(p=elem;pelem+count;p+) /*
9、将原有的数据按照新的表长插入到重建的哈希表中*/ inserthash(h,*p); status inserthash(hashtable *h,elemtype e) /* 查找不成功时插入数据元素e 到开放定址哈希表h中,并返回ok ; */ /* 若冲突次数过大,则重建哈希表。*/ int c,p; c=0; if(searchhash(*h,e.key,&p,&c) /* 表中已有与e 有相同关键字的元素 */ return duplicate; else if(chashsize(*h).sizeindex/2) /* 冲突次数c 未达到上限 ,(c的阀值可调 )
10、*/ /* 插入 e */ (*h).elemp=e; +(*h).count; return ok; else recreatehashtable(h); /* 重建哈希表 */ return error; void traversehash(hashtable h,void(*vi)(int,elemtype) /* 按哈希地址的顺序遍历哈希表 */ int i; printf(哈希地址0%dn,m-1); for(i=0;im;i+) if(h.elemi.key!=nullkey) /* 有数据 */ vi(i,h.elemi); status find(hashtable h,key
11、type k,int *p) /* 在开放定址哈希表h中查找关键码为k的元素 , 若查找成功 , 以 p 指示待查数据 */ /* 元素在表中位置, 并返回 success; 否则 , 返回 unsuccess */ int c=0; *p=hash(k); /* 求得哈希地址 */ while(h.elem*p.key!=nullkey&!eq(k,h.elem*p.key) /* 该位置中填有记录并且关键字不相等 */ c+; if(cm) collision(p,c); /* 求得下一探查地址p */ else return unsuccess; /* 查找不成功 (h.elem
12、p.key=nullkey) */ if eq(k,h.elem*p.key) return success; /* 查找成功, p 返回待查数据元素位置 */ else return unsuccess; /* 查找不成功 (h.elemp.key=nullkey) */ void print(int p,elemtype r) printf(address=%d (%d,%d)n,p,r.key,r.ord); void main() elemtype rn=17,1,60,2,29,3,38,4,1,5,2,6,3,7,4,8,60,9,13,10; hashtable h; int i
13、,p; status j; keytype k; inithashtable(&h); for(i=0;in-1;i+) /* 插入前 n-1 个记录 */ j=inserthash(&h,ri); if(j=duplicate) printf(表中 已有关键字为%d的记录,无 法再插入记录(%d,%d)n,ri.key,ri.key,ri.ord); printf(按哈希地址的顺序遍历哈希表:n); traversehash(h,print); printf(请输入待查找记录的关键字: ); scanf(%d,&k); j=find(h,k,&p); if(j=success) print(p,h.elemp); else printf(没找到 n); j=inserthash(&h,ri); /* 插入第 n个记录 */ if(j=error) /* 重建哈希表 */ j=inserthash(&h,ri); /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学(历史学)中国近现代史期末测试题及答案
- 2025年高职(游戏设计)游戏关卡设计试题及答案
- 制药企业安全培训内容课件
- 工程安全资料培训课件
- 公安自查自纠报告及整改措施详述
- 2026CNAO全国中学生天文知识竞赛预赛试题(附答案)
- 广东省东莞市虎门镇2024-2025学年三年级上册期末考试数学试卷(含答案)
- 铁路防雨线路维护协议
- 2026年WMS仓储管理咨询协议
- 2026年普法依法治理工作计划4篇
- 农村经济统计培训
- 滴滴出行网约车加盟合作协议
- 广东工业大学《嵌入式系统软件设计A》2023-2024学年第二学期期末试卷
- 会议推广费合同范本
- 提高路缘石安装施工一次合格率
- 湖北省孝感市汉川市2023-2024学年八年级上学期期末考试数学试卷(含解析)
- 工程质量保证书范本保证书
- 2024年东北大学马克思主义基本原理概论(期末考试题+答案)1
- 小市政施工方案样本
- 剧场工作总结
- GB/T 42765-2023保安服务管理体系要求及使用指南
评论
0/150
提交评论