定义哈希表为H(key)=key%11,输入表长(大于、等于11)。输入关键字集合,用线性探测在散列构建哈希表,并查找给定关键字。
#include<iostream>
using namespace std;
int main(){
int t; // 测试用例的数量
cin >> t;
while(t--){ // 处理每个测试用例
int m, n; // m是哈希表的大小,n是插入的元素数量
cin >> m >> n;
int* p = new int[m]; // 存储实际的哈希值
int* z = new int[m]; // 标记位置是否被占用
for(int i = 0; i < m; i++){ // 初始化p和z数组
p[i] = 0;
z[i] = 0;
}
int x; // 临时变量,未使用
while(n--){ // 插入n个元素
int a; // 待插入的元素
cin >> a;
int i = a % 11; // 计算哈希值,模11可能有误,应为模m
while(z[i] == 1){ // 使用线性探测法寻找空位
i = (i + 1) % m;
}
p[i] = a; // 插入元素到位置i
z[i] = 1; // 标记位置i已被占用
}
for(int i = 0; i < m; i++){ // 输出哈希表的状态
if(p[i] != 0)
cout << p[i];
else
cout << "NULL";
if(i < m - 1)
cout << " ";
else
cout << endl;
}
int k; // 查询的数量
cin >> k;
while(k--){ // 处理每个查询
int a; // 查询的元素
cin >> a;
int num = 0; // 记录查找的次数
int i = a % 11; // 计算初始位置,模11可能有误,应为模m
int K = 0; // 标记是否找到
while(1){ // 查找循环
if(p[i] == a){
K = 1;
break;
}
else if(p[i] == 0){
K = 0;
break;
}
else{
i = (i + 1) % m;
num++;
}
}
if(K == 1)
cout << "1 " << num + 1 << " " << i + 1 << endl;
else
cout << "0 " << num + 1 << endl;
}
}
return 0;
}