给定一组元素的关键字hash[] = {78,90,66,70,155,82,123,231},利用除留余数法和线性再探测散列法将元素存储再哈希表中,并查找给定的关键字,求平均查找长度。
分析:主要考察哈希表的构造和冲突解决办法
代码:
#include "pch.h"
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;// 关键字类型
typedef struct//元素类型定义
{
KeyType 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);
int SearchHash(HashTable H, KeyType k);
void DisplayHash(HashTable H, int m);
void HashASL(HashTable H, int m);
/*-----------主函数------------*/
int main()
{
int hash[] = { 78,90,66,70,155,82,123,231 };
int m = 11;
int p = 11, n = 8, pos;
KeyType k;
HashTable H;
CreateHashTable(&H, m, p, hash, n);
DisplayHash(H, m);
k = 155;
pos = SearchHash(H, k);
printf("关键字%d在哈希表中的位置为:%d\n", k, pos);
HashASL(H, m);
return 0;
}
/*----------函数定义------------*/
void CreateHashTable(HashTable *H, int m, int p, int hash[], int n)
//创建一个空的Hash表,并处理冲突
{
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;//关键字设置为-1
(*H).data[i].hi= 0;// 冲突次数为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 = 1;
}
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).curSize = n;//关键字个数
(*H).tablesize = m;//哈希表的长度
}
int SearchHash(HashTable H, KeyType k)
//在哈希表中查找关键字为k的元素
{
int d, d1, m;
m = H.tablesize;
d = d1 = k % m;
while (H.data[d].key!=-1)//遇到了空位,那肯定找不到
{
if (H.data[d].key == k)//找到了
return d;
else//由于可能存在冲突可能这个关键字没有存在这个地方
{
d = (d + 1) % m;//继续往后查找
}
if (d == d1)//找完了一圈所有的位置
return 0;
}
return 0;
}
void HashASL(HashTable H, int m)
//求平均查找长度
{
float average = 0;
int i;
for (i = 0; i < m; i++)
{
average = average + H.data[i].hi;
}
average /= H.curSize;
printf("平均查找长度ASL=%2f", average);
}
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");
}
程序运行结果: