(1) 输入一组记录,采用除留余数法构造哈希函数,采用线性探测再散列法处理 冲突,构造一个哈希表。 (2) 给定一个关键字值,在第 1 步中构造出的哈希表中进行查找,输出查找结果。 【实验要求】 1. 哈希表的长度 m 和哈希函数 H(key)=key mod p 中的参数 p 均从终端输入, 待存储的一组整数也由终端输入; 2. 在哈希表中进行查找时,若查找成功时则需输出该数据元素及其哈希地址。用c语言实现
时间: 2024-03-09 13:50:55 浏览: 64
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数采用除留余数法构造,用线性探测再散列法处理冲突。
好的,我来为你提供一个用 C 语言实现的除留余数法构造哈希表,并采用线性探测再散列法处理冲突的示例代码。以下是代码的注释和解释:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 哈希表的最大长度
// 定义哈希表的结构体
typedef struct {
int data[MAX_SIZE]; // 哈希表中存储数据的数组
int count; // 哈希表中已存储的数据个数
} HashTable;
// 哈希函数:除留余数法
int hash(int key, int p) {
return key % p;
}
// 线性探测再散列法处理冲突
int linearProbing(int key, int i, int m) {
return (hash(key, m) + i) % m;
}
// 构造哈希表
void createHashTable(HashTable *h, int m, int p) {
int i, j;
int key;
// 初始化哈希表
h->count = 0;
for (i = 0; i < m; i++) {
h->data[i] = -1;
}
// 从终端输入待存储的一组整数,将它们插入哈希表中
printf("请输入待存储的一组整数:\n");
for (i = 0; i < m; i++) {
scanf("%d", &key);
j = 0;
while (h->data[linearProbing(key, j, m)] != -1) {
j++;
}
h->data[linearProbing(key, j, m)] = key;
h->count++;
}
}
// 在哈希表中查找关键字
int searchHashTable(HashTable h, int key, int m) {
int i = 0;
int addr = linearProbing(key, i, m);
while (h.data[addr] != -1 && h.data[addr] != key) {
i++;
addr = linearProbing(key, i, m);
}
if (h.data[addr] == key) {
printf("查找成功,该数据元素为 %d,哈希地址为 %d\n", key, addr);
return addr;
} else {
printf("查找失败,该数据元素不存在于哈希表中\n");
return -1;
}
}
int main() {
int m, p;
int key;
// 从终端输入哈希表的长度 m 和哈希函数中的参数 p
printf("请输入哈希表的长度和哈希函数中的参数 p:\n");
scanf("%d%d", &m, &p);
// 创建哈希表
HashTable h;
createHashTable(&h, m, p);
// 从终端输入要查找的关键字值,进行查找
printf("请输入要查找的关键字值:\n");
scanf("%d", &key);
searchHashTable(h, key, m);
return 0;
}
```
在上面的代码中,我们定义了一个 `HashTable` 结构体,其中包含一个用于存储数据的数组 `data` 和一个已存储数据个数的计数器 `count`。我们使用除留余数法作为哈希函数,使用线性探测再散列法处理冲突。 `createHashTable()` 函数用于构造哈希表, `searchHashTable()` 函数用于在哈希表中查找关键字。在 `main()` 函数中,我们从终端输入哈希表的长度和哈希函数中的参数 `p`,然后创建哈希表,并从终端输入要查找的关键字值,进行查找。
希望这个示例代码能够帮助到你!
阅读全文