#include <stdio.h> #include <stdlib.h> typedef struct //元素类型定义 { int key;//关键字 int hi; //冲突次数 }DataType; typedef struct //哈希表的类型 { DataType *data; int tableSize; //哈希表的长度 int curSize; //关键字的个数 }HashTable; void CreateHashTable(HashTable *H, int m, int p, int hash[], int n); void DisplayHash(HashTable H, int m); //显示哈希表 int SearchHash(HashTable H, int k); int main(void) { int hash[] = { 23,35,12,56,123,39,342,90 }; int m = 11, p = 11, n = 8, pos; int k ; HashTable H; CreateHashTable(&H, m, p, hash, n); DisplayHash(H, m); k = 123; pos = SearchHash(H, k); printf("关键字%d在哈希表中的位置%d\n", k, pos); system("pause"); return 0; } //创建哈希表 void CreateHashTable(HashTable *H, int m, int p, int hash[], int n) { int i, sum, addr, di, k = 1; //为哈希表分配存储空间 (*H).data = (DataType*)malloc(m * sizeof(DataType)); if (!(*H).data) exit(-1); for (i = 0;i < m;i++) //初始化哈希表 { (*H).data[i].key = -1; (*H).data[i].hi = 0; } for (i = 0;i < n;i++)//求哈希表函数地址并处理冲突 { sum = 0;//冲突的次数 addr = hash[i] % p;//利用余数法求哈希函数地址 di = addr; if ((*H).data[addr].key == -1) { (*H).data[addr].key = hash[i]; (*H).data[addr].hi = 0; } else //利用线性探测在哈希法处理冲突 { do { di = (di + k) % m; sum += 1; } while ((*H).data[di].key != -1); (*H).data[di].key = hash[i]; (*H).data[di].hi = sum + 1; } } (*H).tableSize = m; (*H).curSize = n; } void DisplayHash(HashTable H, int m) //显示哈希表 { int i; printf("哈希表地址:"); for (i = 0;i < m;i++) printf("%-5d", i); printf("\n"); printf("关键字Key:"); for (i = 0;i < m;i++) printf("%-5d", H.data[i].key); printf("\n"); printf("冲突次数"); for (i = 0;i < m;i++) printf("%-5d",H.data[i].hi); printf("\n"); } //在哈希表中查找关键字K的位置 int SearchHash(HashTable H, int k) { int d, dl, m; m = H.tableSize; d = dl = k * m; while (H.data[d].key != -1) { if (H.data[d].key == k) return d; else d = (d + 1) % m; if (d == dl) return 0; } return 0; }
C语言数据结构--哈希表
猜你喜欢
转载自blog.csdn.net/zjy900507/article/details/80695735
今日推荐
周排行