博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构之哈希表
阅读量:5330 次
发布时间:2019-06-14

本文共 2406 字,大约阅读时间需要 8 分钟。

仅给出一个以“除留余数法”+“开放定址法(线性探測再散列)”实现的哈希表代码:

#pragma once#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1#define NULLKEY -111#define OK 1#define ERROR -1#define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)< (b))#define LQ(a,b) ((a)<=(b))typedef int KeyType;typedef int info;typedef struct{	KeyType key;	//info otherinfo;}ElemType;typedef struct{	ElemType *elem;	int count;		 //当前hash表元素个数	int sizeindex;	 //hashsize[sizeindex]为当前hash表当前容量}HashTable;int InitHashTable(HashTable &H); // 构造一个空的哈希表void DestroyHashTable(HashTable &H);int Hash(KeyType K); // 除留余数法(m为表长。全局变量)void collision(int &p,int d);// 开放定址法处理冲突:线性探測再散列int SearchHash(HashTable H,KeyType K,int &p,int &c);   //搜索的是keywordint InsertHash(HashTable &H,ElemType e);			   //插入的是元素void RecreateHashTable(HashTable &H) /* 重建哈希表 */;void TraverseHash(HashTable H);
#include "hash.h"#include 
#include
int hashsize[]={13,19,29,37}; // 哈希表容量递增表,一个合适的素数序列int m = 0; // 哈希表表长,全局变量int InitHashTable(HashTable &H) // 构造一个空的哈希表{ int i; H.count=0; // 当前元素个数为0 H.sizeindex=0; // 初始存储容量为hashsize[0] m = hashsize[0]; H.elem=(ElemType*)malloc(m*sizeof(ElemType)); if(!H.elem) exit(0); // 存储分配失败 for(i=0;i
=m) break; } if(H.elem[p].key!=NULLKEY&&EQ(K,H.elem[p].key)) return SUCCESS; else return UNSUCCESS;}//SearchHashint InsertHash(HashTable &H,ElemType e){ // 查找不成功时插入数据元素e到开放定址哈希表H中,并返回OK;若冲突次数过大,则重建哈希表 int c,p; c=0; if(SearchHash(H,e.key,p,c)) // 表中已有与e有同样keyword的元素 return DUPLICATE; else if(c
key!=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(-1); // 存储分配失败 H.elem=p; for(i=0;i
測试代码:

int main(){	HashTable H;	int i;	KeyType arr[] = {19, 14, 23, 01, 68, 20, 84, 27, 55, 11, 10, 79};  //keyword	int n = sizeof(arr)/sizeof(arr[0]);	InitHashTable(H);	ElemType e;	for (i = 0; i < n - 1; i++)//n	{		e.key = arr[i];		InsertHash(H, e);   //插入的是元素		printf("插入 %d 后:\n", e.key);		TraverseHash(H);	}	printf("Hash表元素为:\n");	TraverseHash(H);	for (i = 0; i < n; i++)	{		int p = 0, c = 0;		int ret = SearchHash(H, arr[i], p, c);	//查找的是keyword		if(ret)			printf("查找 %2d 成功, p = %2d, key = %2d, c = %d\n",arr[i], p, H.elem[p].key, c);		else 			printf("查找 %d 失败\n", arr[i]);	}	DestroyHashTable(H);	getchar();	return 1;}

转载于:https://www.cnblogs.com/llguanli/p/6811996.html

你可能感兴趣的文章
vsftpd虚拟用户【公司系统部分享】
查看>>
盒子box在网页中居中的方法
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Swift和OC混编
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
[PHP] excel 的导入导出
查看>>
SDL(01-10)
查看>>
IM开发通信协议基础知识(一)---TCP、UDP、HTTP、SOCKET
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
FastReport.Net使用:[18]形状(Shape)控件用法
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
字典常用方法
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
python的猴子补丁monkey patch
查看>>