以c语言编写一下程序:给定一系列整型关键字和素数P,用除留余数法定义的散列函数H(Key)=Key将关键字映射到长度为P的散列表中。用线性探测法解决冲突。 输入格式: 输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。 输出格式: 在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。 输入样例: 4 5 24 15 61 88 输出样例: 4 0 1 3
时间: 2024-03-20 12:43:21 浏览: 138
以下是基于除留余数法和线性探测法的哈希表的C语言代码,实现插入关键字并输出每个关键字在散列表中的位置:
```c
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#define MAXN 1001 // 最大关键字总数
// 判断是否为素数
bool isPrime(int n) {
if (n <= 1) return false;
int sqr = sqrt(n);
for (int i = 2; i <= sqr; i++) {
if (n % i == 0) return false;
}
return true;
}
// 找到大于等于n的最小素数
int findMinPrime(int n) {
while (!isPrime(n)) {
n++;
}
return n;
}
// 除留余数法散列函数
int hash(int key, int p) {
return key % p;
}
int main() {
int n, p;
scanf("%d %d", &n, &p);
p = findMinPrime(p); // 找到大于等于p的最小素数
int hashTable[p]; // 散列表
for (int i = 0; i < p; i++) {
hashTable[i] = -1; // 初始化散列表
}
for (int i = 0; i < n; i++) {
int key;
scanf("%d", &key);
int pos = hash(key, p);
if (hashTable[pos] == -1) { // 散列表中的位置为空,则直接插入
hashTable[pos] = key;
} else { // 发生冲突,则进行线性探测
int j = 1;
while (hashTable[(pos + j) % p] != -1) { // 寻找下一个空位置
j++;
}
hashTable[(pos + j) % p] = key;
}
printf("%d", pos); // 输出关键字在散列表中的位置
if (i != n - 1) printf(" "); // 行末不能有多余空格
}
printf("\n");
return 0;
}
```
输入样例:
```
4 5
24 15 61 88
```
输出样例:
```
4 0 1 3
```
阅读全文