正确结果为ASL应该为3,key应该为6,散列表应该为-1 15 -1 24 10 19 17 38 18 40,经过比较的关键字应该是24 10 19 17,并写出C语言代码 【问题描述】采用除留余数法构造哈希表,并利用线性探测法解决哈希表中的冲突。H(key)=key mod p;p 取接近表长的最大素数。先输入再输出。 【输入】(1)先从键盘输入表长 (2)输入若干整数代表关键字集合,以-1 作为结束。 (2)从键盘输入待查找的关键字, 【输出】(1)输出该哈希表,没有关键字的地址用-1代替 (2)其查找成功的平均查找长度(保留至小数点后3位); (3)输出查找过程中经比较的关键字 (4)输出该关键字的哈希地址key,并如果不存在该关键字,输出查找过程中经比较的关键字之后输出 not found。 【样例输入】 10 //表长 19 24 10 17 15 38 18 40 -1 //关键字集合 17 //要查找的关键字 【样例输出】 -1 15 -1 24 10 19 17 38 18 40 ASL=3 24 10 19 17 key=6
时间: 2024-02-15 09:05:28 浏览: 55
用二次探测再散列法解决冲突建立哈希表并查找
4星 · 用户满意度95%
以下是C语言代码,其中使用了结构体来表示哈希表中的每一个条目,包括关键字和地址:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100
typedef struct {
int key;
int addr;
} Entry;
int is_prime(int n) {
if (n < 2) {
return 0;
}
int i;
for (i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
int get_prime(int n) {
while (!is_prime(n)) {
n++;
}
return n;
}
int hash(int key, int size) {
return key % size;
}
int linear_probe(int i, int size) {
return i % size;
}
int main() {
int size, i, key, addr, found = 0, count = 0;
float asl = 0.0;
Entry table[MAX_SIZE];
printf("请输入哈希表的长度:");
scanf("%d", &size);
size = get_prime(size);
printf("请输入关键字集合,以-1结束:");
for (i = 0; i < MAX_SIZE; i++) {
table[i].key = -1;
table[i].addr = -1;
}
scanf("%d", &key);
while (key != -1) {
addr = hash(key, size);
i = 0;
while (table[addr].key != -1) {
i++;
addr = (hash(key, size) + linear_probe(i, size)) % size;
}
table[addr].key = key;
table[addr].addr = addr;
scanf("%d", &key);
}
printf("哈希表如下:\n");
for (i = 0; i < size; i++) {
if (table[i].addr == -1) {
printf("-1 ");
} else {
printf("%d ", table[i].key);
}
}
printf("\n请输入要查找的关键字:");
scanf("%d", &key);
addr = hash(key, size);
i = 0;
while (table[addr].key != -1 && i < size) {
count++;
if (table[addr].key == key) {
found = 1;
break;
}
i++;
addr = (hash(key, size) + linear_probe(i, size)) % size;
}
if (found) {
printf("经比较的关键字为:");
for (i = 0; i <= count; i++) {
printf("%d ", table[(addr - i + size) % size].key);
asl += 1.0;
}
asl /= count + 1;
printf("\n查找成功,哈希地址为%d,ASL=%.3f\n", addr, asl);
} else {
printf("经比较的关键字为:");
for (i = 0; i < size; i++) {
printf("%d ", table[(addr - i + size) % size].key);
}
printf("\n查找失败,未找到该关键字\n");
}
return 0;
}
```
阅读全文