正确结果为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 18:05:29 浏览: 187
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100
typedef struct {
int *elem; // 哈希表
int count; // 当前元素个数
int size; // 哈希表长度
} HashTable;
// 判断是否为素数
int isPrime(int n) {
if (n <= 1) {
return 0;
}
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}
// 获取离size最近的素数
int getPrime(int size) {
for (int i = size; i < MAX_SIZE; i++) {
if (isPrime(i)) {
return i;
}
}
return size;
}
// 初始化哈希表
void initHashTable(HashTable *hashTable, int size) {
hashTable->count = 0;
hashTable->size = getPrime(size);
hashTable->elem = (int *)malloc(hashTable->size * sizeof(int));
for (int i = 0; i < hashTable->size; i++) {
hashTable->elem[i] = -1;
}
}
// 哈希函数
int hash(int key, int p) {
return key % p;
}
// 线性探测法解决冲突
int linearProbing(HashTable *hashTable, int key, int p) {
int addr = hash(key, p);
while (hashTable->elem[addr] != -1 && hashTable->elem[addr] != key) {
addr = (addr + 1) % hashTable->size;
}
return addr;
}
// 插入元素
void insert(HashTable *hashTable, int key, int p) {
int addr = linearProbing(hashTable, key, p);
hashTable->elem[addr] = key;
hashTable->count++;
}
// 查找元素
int search(HashTable *hashTable, int key, int p, int *cmp) {
int addr = hash(key, p);
*cmp = 1;
while (hashTable->elem[addr] != -1) {
if (hashTable->elem[addr] == key) {
return addr;
}
addr = (addr + 1) % hashTable->size;
(*cmp)++;
}
return addr;
}
int main() {
int size, key;
HashTable hashTable;
printf("请输入哈希表长度:");
scanf("%d", &size);
initHashTable(&hashTable, size);
printf("请输入关键字集合,以-1结束:\n");
int num, i = 0;
while (1) {
scanf("%d", &num);
if (num == -1) {
break;
}
insert(&hashTable, num, hashTable.size);
i++;
}
printf("请输入要查找的关键字:");
scanf("%d", &key);
int cmp = 0;
int addr = search(&hashTable, key, hashTable.size, &cmp);
printf("哈希表:");
for (int i = 0; i < hashTable.size; i++) {
printf("%d ", hashTable.elem[i]);
}
printf("\n");
if (hashTable.elem[addr] != -1) {
printf("查找成功,平均查找长度为:%.3f\n", (float)cmp / i);
printf("经过比较的关键字为:");
for (int i = addr - 1; i >= 0; i--) {
if (hashTable.elem[i] != -1) {
printf("%d ", hashTable.elem[i]);
}
}
printf("\n");
printf("key=%d\n", addr);
} else {
printf("查找失败,经过比较的关键字为:");
for (int i = addr - 1; i >= 0; i--) {
if (hashTable.elem[i] != -1) {
printf("%d ", hashTable.elem[i]);
}
}
printf("not found\n");
}
return 0;
}
```
阅读全文