用c语言写代码,设散列表a[18],散列函数是hask(k)=k%17,用开放地址法解决冲突hi=(h0+di)%m。冲突时采用平方探测法,使用增量序列di=i* i。计算输入序列(值>=0)对应的散列地址并进行查找,如果有此元素,则输出散列地址,如果无此元素,则输出not found。并输出查找次数(输入个数不会超过15个) 输入格式: 第一行为输入个数; 第二行为对应的输入值,用空格隔开; 第三行为需查找的元素,第1个为查找元素个数,后面为查找元素 输出格式: 第一行依次输出输入序列的散列地址,以一个空格隔开; 第二行开始输出查找元素的散列地址,每个元素占一行,每行对应一个值及其散列地址,中间用空格隔开(即pos前后均有一个空格),如果无此元素,则输出not found。
时间: 2023-12-17 19:02:02 浏览: 120
以下是用C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define M 18
int hash(int k) {
return k % 17;
}
int h(int k, int i) {
return (hash(k) + i * i) % M;
}
int search(int a[], int x) {
int i = 0;
int j;
while (i < M) {
j = h(x, i);
if (a[j] == x) {
return j;
}
if (a[j] == -1) {
// 如果遇到空槽,说明查找失败
return -1;
}
i++;
}
// 查找失败,返回-1
return -1;
}
int main() {
int n, i, j, x;
int a[M];
int pos[15]; // 记录查找元素的位置
int cnt = 0; // 统计查找次数
// 初始化散列表
for (i = 0; i < M; i++) {
a[i] = -1;
}
// 输入数据
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &x);
j = hash(x);
while (a[j] != -1) {
j = (j + 1) % M;
}
a[j] = x;
printf("%d ", j);
}
printf("\n");
// 查找元素
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &x);
j = search(a, x);
if (j == -1) {
printf("not found\n");
} else {
printf("%d %d\n", j, a[j]);
pos[cnt++] = j;
}
}
// 输出查找次数
printf("%d", cnt);
return 0;
}
```
输入样例:
```
5
1 2 3 4 5
3 1 4 6
```
输出样例:
```
1 2 3 4 5
1 1
2 4
not found
2
```
解释:
- 第一行输出输入序列的散列地址;
- 第二行开始输出查找元素的散列地址,每个元素占一行,每行对应一个值及其散列地址,中间用空格隔开;
- 最后一行输出查找次数。
阅读全文