用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-01-24 16:17:02 浏览: 58
```c
#include <stdio.h>
#include <math.h>
#define M 18
int hash(int k) {
return k % 17;
}
int h(int k, int i) {
return (hash(k) + i * i) % M;
}
int find(int a[], int k) {
for (int i = 0; i < M; i++) {
int j = h(k, i);
if (a[j] == k) {
return j;
}
if (a[j] == -1) {
return -1;
}
}
return -1;
}
int main() {
int n;
scanf("%d", &n);
int a[M];
for (int i = 0; i < M; i++) {
a[i] = -1;
}
for (int i = 0; i < n; i++) {
int k;
scanf("%d", &k);
int j = hash(k);
while (a[j] != -1) {
j = (j + 1) % M;
}
a[j] = k;
}
for (int i = 0; i < M; i++) {
printf("%d ", hash(a[i]));
}
printf("\n");
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++) {
int k;
scanf("%d", &k);
int j = find(a, k);
if (j == -1) {
printf("not found,try %d\n", M);
} else {
printf("%d pos:%d,try %d\n", k, j, j + 1);
}
}
return 0;
}
```
阅读全文