用c语言编写程序,实现哈希查找:(1)输入一组记录,采用除留余数法构造哈希函数输出格式:查找结果,如果找到:两行数据,第一行表示的两个数据分别表示是否找到和哈希地址;第二行表示用哈希表中相应的记录。如果没找到,显示查找结果。,采用线性探测再散列法处理冲突,构造一个哈希表。(2)给定一个关键字值,在第1步中构造出的哈希表中进行查找,输出查找结果。【实验要求】1.哈希表的长度m 和哈希函数H(key)=key mod p中的参数p均从终端输入,待存储的一组整数也由终端输入;2.在哈希表中进行查找时,若查找成功时则需输出该数据元素及其哈希地址。输入格式:第一行的3个整数分别表示哈希表的表长m、函数函数H(key)=key mod p中的参数p和记录的个数n;n 行数据,每行数据的两个整数之间以空格分隔,分别表示第i条记录的关键字域和其他域。最后一行的数据表示要查找的记录的关键字值。
时间: 2024-03-25 14:38:51 浏览: 59
好的,这是一个比较典型的哈希查找问题,我来给你讲解一下。
首先,我们需要定义一个哈希表节点的结构体,包括关键字和其他域,以及标记是否被使用过。代码如下:
```c
typedef struct HashNode {
int key;
int value;
int used;
} HashNode;
```
然后,我们需要实现哈希函数和哈希表的构造。这里采用除留余数法作为哈希函数,采用线性探测再散列法处理冲突。代码如下:
```c
int hash(int key, int m, int p) {
return key % p % m;
}
HashNode* insert(HashNode *table, int key, int value, int m, int p) {
int index = hash(key, m, p);
int i = 0;
while (table[index].used && table[index].key != key) {
index = (index + 1) % m;
i++;
if (i == m) {
return NULL;
}
}
table[index].key = key;
table[index].value = value;
table[index].used = 1;
return table + index;
}
```
接着,我们需要实现哈希表的查找操作,代码如下:
```c
HashNode* search(HashNode *table, int key, int m, int p) {
int index = hash(key, m, p);
int i = 0;
while (table[index].used && table[index].key != key) {
index = (index + 1) % m;
i++;
if (i == m) {
return NULL;
}
}
if (table[index].used) {
return table + index;
} else {
return NULL;
}
}
```
下面是完整的程序代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct HashNode {
int key;
int value;
int used;
} HashNode;
int hash(int key, int m, int p) {
return key % p % m;
}
HashNode* insert(HashNode *table, int key, int value, int m, int p) {
int index = hash(key, m, p);
int i = 0;
while (table[index].used && table[index].key != key) {
index = (index + 1) % m;
i++;
if (i == m) {
return NULL;
}
}
table[index].key = key;
table[index].value = value;
table[index].used = 1;
return table + index;
}
HashNode* search(HashNode *table, int key, int m, int p) {
int index = hash(key, m, p);
int i = 0;
while (table[index].used && table[index].key != key) {
index = (index + 1) % m;
i++;
if (i == m) {
return NULL;
}
}
if (table[index].used) {
return table + index;
} else {
return NULL;
}
}
int main() {
int m, p, n, key, value, search_key;
scanf("%d%d%d", &m, &p, &n);
HashNode *table = (HashNode *)malloc(m * sizeof(HashNode));
for (int i = 0; i < m; i++) {
table[i].key = 0;
table[i].value = 0;
table[i].used = 0;
}
for (int i = 0; i < n; i++) {
scanf("%d%d", &key, &value);
HashNode *node = insert(table, key, value, m, p);
if (node == NULL) {
printf("Insert failed\n");
}
}
scanf("%d", &search_key);
HashNode *result = search(table, search_key, m, p);
if (result == NULL) {
printf("Not found\n");
} else {
printf("Found\n");
printf("%d %d\n", result->used, hash(result->key, m, p));
printf("%d %d\n", result->key, result->value);
}
free(table);
return 0;
}
```
输入格式如下:
```
5 7 4
22 1
20 2
16 3
10 4
20
```
输出格式如下:
```
Found
1 1
20 2
```
阅读全文