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 20:02:02 浏览: 190
数据结构实验C语言实现散列表-构造-解决冲突-查找.pdf
下面是C语言的代码实现:
```c
#include <stdio.h>
#define M 18
#define EMPTY -1
#define NOT_FOUND -2
int a[M];
int hash(int k) {
return k % 17;
}
int probe(int h, int i) {
return (h + i * i) % M;
}
int insert(int k) {
int h = hash(k);
int i = 0;
while (i < M) {
int j = probe(h, i);
if (a[j] == EMPTY) {
a[j] = k;
return j;
}
i++;
}
return NOT_FOUND;
}
int search(int k) {
int h = hash(k);
int i = 0;
while (i < M) {
int j = probe(h, i);
if (a[j] == k) {
return j;
} else if (a[j] == EMPTY) {
return NOT_FOUND;
}
i++;
}
return NOT_FOUND;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < M; i++) {
a[i] = EMPTY;
}
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
printf("%d ", hash(x));
insert(x);
}
printf("\n");
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++) {
int x;
scanf("%d", &x);
int pos = search(x);
if (pos == NOT_FOUND) {
printf("not found\n");
} else {
printf("%d %d\n", x, pos);
}
}
return 0;
}
```
输入格式:
```
5
12 44 13 88 23
6 44 12 23 13 15 17
```
输出格式:
```
15 10 14 4 6 1 2
44 10
12 15
23 4
13 14
15 not found
17 not found
```
其中,第一行依次输出输入序列的散列地址,第二行开始输出查找元素的散列地址,每个元素占一行,每行对应一个值及其散列地址,中间用空格隔开。如果无此元素,则输出not found。
阅读全文