仅给出一个以“除留余数法”+“开放定址法(线性探測再散列)”实现的哈希表代码:
#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;}