题目描述
定义哈希函数为H(key) = key%11。输入表长(大于、等于11),输入关键字集合,用线性探测再散列构建哈希表,并查找给定关键字。
–程序要求–
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分处理 不允许使用第三方对象或函数实现本题的要求输入
测试次数t
每组测试数据为:
哈希表长m、关键字个数n
n个关键字
查找次数k
k个待查关键字
输出
对每组测试数据,输出以下信息:
构造的哈希表信息,数组中没有关键字的位置输出NULL
对k个待查关键字,分别输出:0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)
样例输入
1
12 10
22 19 21 8 9 30 33 4 15 14
4
22
56
30
17
样例输出
22 30 33 14 4 15 NULL NULL 19 8 21 9
1 1 1
0 6
1 6 2
0 1
线性探测再散列 意思是
插入顺序为 4 16 7
当插入7 时,16 已经在index = 7 上
就把7放在下一个数组位置 index = 8
如果下一个还是有数,就继续寻找
#include <iostream>
using namespace std;
class HashTable {
private:
int *data;
int size;
public:
HashTable(int n) {
size = n;
data = new int[size];
for (int i = 0; i < size; i++) {
data[i] = -1;
}
}
int Hash(int n) {
return n%11;
}
void insert(int n, int hash) {
hash %= size; //循环判断直到找到NULL
if(data[hash] == -1) {
data[hash] = n;
} else {
if(data[hash + 1] == -1) {
data[hash + 1] = n;
} else {
insert(n,hash+1);
}
}
}
void search(int find){
int cnt = 0, index = 0;
int hash = Hash(find);
while(1){
hash %= size;
cnt++;
if(data[hash] == find){
cout<<"1 "<<cnt<<" "<<hash + 1<<"\n";
return ;
}
if(data[hash] == -1){
cout<<"0 "<<cnt<<"\n";
return ;
}
hash++;
}
}
void print(){
for(int i = 0; i < size; i++){
if(data[i] > 0){
cout<<data[i]<<" ";
}else{
cout<<"NULL ";
}
}
cout<<endl;
}
~HashTable() {
delete[] data;
}
};
int main() {
int t;
cin>>t;
while(t--) {
int size,n;
cin>>size>>n;
HashTable h(size);
while(n--) {
int data;
cin>>data;
h.insert(data,h.Hash(data));
}
h.print();
int k;
cin>>k;
while(k--){
int find;
cin>>find;
h.search(find);
}
}
return 0;
}