C语言代码实现,设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m。冲突时,使用增量序列di=5i。计算输入序列(值>=0)对应的散列地址值。(输入个数不会超过15个)
时间: 2023-07-16 18:14:53 浏览: 326
以下是C语言代码实现:
```c
#include <stdio.h>
#define M 18
int hask(int k) {
return k % 17;
}
int open_addressing(int a[], int k) {
int h = hask(k);
if (a[h] == -1) {
a[h] = k;
return h;
}
int i = 1;
while (1) {
int hi = (h + 5 * i) % M;
if (a[hi] == -1) {
a[hi] = k;
return hi;
}
i++;
}
}
int main() {
int a[M];
for (int i = 0; i < M; i++) {
a[i] = -1;
}
int n;
printf("请输入数字个数:");
scanf("%d", &n);
printf("请输入%d个数字:\n", n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
int h = open_addressing(a, x);
printf("%d ", h);
}
return 0;
}
```
程序首先定义了散列表 `a`,并且定义了散列函数 `hask(k)`。然后定义了开放地址法解决冲突的函数 `open_addressing`,该函数接收一个散列表和一个数字 `k`,并根据散列函数计算出 `k` 对应的散列地址。如果该地址没有被占用,则直接将 `k` 存储在该地址中,并返回该地址。如果该地址已经被占用,则使用增量序列 `di=5i`,不断计算下一个地址,直到找到一个空闲地址并将 `k` 存储在该地址中,并返回该地址。
在 `main` 函数中,程序首先初始化散列表 `a`,将每个元素都设置为 `-1`。然后程序让用户输入数字个数 `n`,并让用户输入 `n` 个数字。对于每个数字,程序调用 `open_addressing` 函数计算出它对应的散列地址,并打印该地址。最终程序返回 0。
阅读全文