用C语言编译以下代码设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m。冲突时采用平方探测法,使用增量序列di=i* i。计算输入序列(值>=0)对应的散列地址并进行查找,如果有此元素,则输出散列地址,如果无此元素,则输出not found。并输出查找次数(输入个数不会超过15个) 输入格式: 第一行为输入个数; 第二行为对应的输入值,用空格隔开; 第三行为需查找的元素,第1个为查找元素个数,后面为查找元素 输出格式: 第一行依次输出输入序列的散列地址,以一个空格隔开; 第二行开始输出查找元素的散列地址,每个元素占一行,每行对应一个值及其散列地址,中间用空格隔开(即pos前后均有一个空格),如果无此元素,则输出not found。 输入样例: 5 141 73 95 112 56 7 5 73 95 141 112 56 18 输出样例: 5 6 10 11 9 5 not found,try 4 73 pos:6,try 2 95 pos:10,try 1 141 pos:5,try 1 112 pos:11,try 2 56 pos:9,try 3 18 not found,try 1
时间: 2024-02-03 17:11:32 浏览: 18
```c
#include <stdio.h>
#include <stdlib.h>
#define M 18
int a[M];
int hash(int k) {
return k % 17;
}
int find(int key) {
int try = 0;
int h0 = hash(key);
int h = h0;
while (a[h] != -1 && a[h] != key && try < M) {
try++;
h = (h0 + try * try) % M;
}
if (a[h] == key) {
printf("%d pos:%d,try %d\n", key, h, try + 1);
} else {
printf("not found,try %d\n", try + 1);
}
return h;
}
int main() {
int n, i;
scanf("%d", &n);
for (i = 0; i < M; i++) {
a[i] = -1;
}
for (i = 0; i < n; i++) {
int num;
scanf("%d", &num);
int h = hash(num);
a[h] = num;
printf("%d ", h);
}
printf("\n");
int m;
scanf("%d", &m);
for (i = 0; i < m; i++) {
int num;
scanf("%d", &num);
find(num);
}
return 0;
}
```