使用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-03-14 17:48:21 浏览: 81
以下是用 C 语言实现的散列表查找代码:
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_SIZE 18 // 散列表大小
// 散列函数,返回元素在散列表中的位置
int hash(int key) {
return key % 17;
}
// 平方探测法,返回元素在散列表中的位置
int probe(int a[], int key) {
int pos = hash(key); // 当前位置
int i = 0; // 探测次数
while (a[pos] != -1 && a[pos] != key && i < MAX_SIZE) {
pos = (pos + i * i) % MAX_SIZE; // 计算新位置
i++; // 探测次数加1
}
return pos;
}
int main() {
int n; // 输入的元素个数
scanf("%d", &n);
int a[MAX_SIZE]; // 散列表
for (int i = 0; i < MAX_SIZE; i++) {
a[i] = -1; // 初始值为-1,表示空
}
int x; // 输入的元素
for (int i = 0; i < n; i++) {
scanf("%d", &x);
int pos = probe(a, x); // 计算散列地址
printf("%d ", pos);
a[pos] = x; // 将元素插入散列表
}
printf("\n");
int m; // 查找的元素个数
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d", &x);
int pos = probe(a, x); // 计算散列地址
if (a[pos] == x) {
printf("%d pos:%d,try %d\n", x, pos, i+1);
} else {
printf("%d not found,try %d\n", x, i+1);
}
}
return 0;
}
```
输入格式:
第一行为输入的元素个数n;
第二行为n个输入值,用空格隔开;
第三行为需查找的元素个数m,后面为m个查找元素。
输出格式:
第一行依次输出输入序列的散列地址,以一个空格隔开;
第二行开始输出查找元素的散列地址,每个元素占一行,每行对应一个值及其散列地址,中间用空格隔开(即pos前后均有一个空格),如果无此元素,则输出not found。
每个输出单独占一行。
时间复杂度:平均情况下为O(1),最坏情况下为O(n)。
阅读全文