#include<stdio.h>#include<stdlib.h>#define SUCCESS 1#define UNSUCCESS 0#define OVERFLOW -1#define OK 1#define ERROR -1#define MAXNUM 9999 // 用于初始化哈希表的记录 keytypedef int Status;typedef int KeyType;// 哈希表中的记录类型typedef struct {KeyType key;}RcdType;// 哈希表类型typedef struct {RcdType *rcd;int size;int count;int *tag;}HashTable;// 哈希表每次重建增长后的大小int hashsize[] = { 11, 31, 61, 127, 251, 503 };int index = 0;// 初始哈希表Status InitHashTable(HashTable &H, int size) {int i;H.rcd = (RcdType *)malloc(sizeof(RcdType)*size);H.tag = (int *)malloc(sizeof(int)*size);if (NULL == H.rcd || NULL == H.tag) return OVERFLOW;KeyType maxNum = MAXNUM;for (i = 0; i < size; i++) {H.tag[i] = 0;H.rcd[i].key = maxNum;}H.size = size;H.count = 0;return OK;}// 哈希函数:除留余数法int Hash(KeyType key, int m) {return (3 * key) % m;}// 处理哈希冲突:线性探测void collision(int &p, int m) {p = (p + 1) % m;}// 在哈希表中查询Status SearchHash(HashTable H, KeyType key, int &p, int &c) {p = Hash(key, H.size);int h = p;c = 0;while ((1 == H.tag[p] && H.rcd[p].key != key) || -1 == H.tag[p]) {collision(p, H.size); c++;}if (1 == H.tag[p] && key == H.rcd[p].key) return SUCCESS;else return UNSUCCESS;}//打印哈希表void printHash(HashTable H){int i;printf("key : ");for (i = 0; i < H.size; i++)printf("%3d ", H.rcd[i].key);printf("\n");printf("tag : ");for (i = 0; i < H.size; i++)printf("%3d ", H.tag[i]);printf("\n\n");}// 函数声明:插入哈希表Status InsertHash(HashTable &H, KeyType key);// 重建哈希表Status recreateHash(HashTable &H) {RcdType *orcd;int *otag, osize, i;orcd = H.rcd;otag = H.tag;osize = H.size;InitHashTable(H, hashsize[index++]);//把所有元素,按照新哈希函数放到新表中for (i = 0; i < osize; i++) {if (1 == otag[i]) {InsertHash(H, orcd[i].key);}}return OK;}// 插入哈希表Status InsertHash(HashTable &H, KeyType key) {int p, c;if (UNSUCCESS == SearchHash(H, key, p, c)) { //没有相同keyif (c*1.0 / H.size < 0.5) { //冲突次数未达到上线//插入代码H.rcd[p].key = key;H.tag[p] = 1;H.count++;return SUCCESS;}else recreateHash(H); //重构哈希表}return UNSUCCESS;}// 删除哈希表Status DeleteHash(HashTable &H, KeyType key) {int p, c;if (SUCCESS == SearchHash(H, key, p, c)) {//删除代码H.tag[p] = -1;H.count--;return SUCCESS;}else return UNSUCCESS;}int main(){printf("-----哈希表-----\n");HashTable H;int i;int size = 11;KeyType array[8] = { 22, 41, 53, 46, 30, 13, 12, 67 };KeyType key;//初始化哈希表printf("初始化哈希表\n");if (SUCCESS == InitHashTable(H, hashsize[index++])) printf("初始化成功\n");//插入哈希表printf("插入哈希表\n");for (i = 0; i <= 7; i++) {key = array[i];InsertHash(H, key);printHash(H);}//删除哈希表printf("删除哈希表中key为12的元素\n");int p, c;if (SUCCESS == DeleteHash(H, 12)) {printf("删除成功,此时哈希表为:\n");printHash(H);}//查询哈希表printf("查询哈希表中key为67的元素\n");if (SUCCESS == SearchHash(H, 67, p, c)) printf("查询成功\n");//再次插入,测试哈希表的重建printf("再次插入,测试哈希表的重建:\n");KeyType array1[8] = { 27, 47, 57, 47, 37, 17, 93, 67 };for (i = 0; i <= 7; i++) {key = array1[i];InsertHash(H, key);printHash(H);}getchar();return 0;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。