#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语言数据结构--哈希表
最新推荐文章于 2023-06-14 18:19:42 发布