题目描述
给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为11,哈希冲突用链地址法和表头插入如果首次查找失败,就把数据插入到相应的位置中
实现哈希查找功能
输入
第一行输入n,表示有n个数据 第二行输入n个数据,都是自然数且互不相同,数据之间用空格隔开 第三行输入t,表示要查找t个数据
从第四行起,每行输入一个要查找的数据,都是正整数输出
每行输出对应数据的查找结果,每个结果表示为数据所在的位置[0-11)和查找次数,中间用空格分开。
样例输入
6
11 23 39 48 75 62
6
39
52
52
63
63
52
样例输出
6 1
error
8 1
error
8 1
8 2
提示
注意,当两次输入要相同的查找数据,如果第一次查找不成功就会执行插入,那么第二次查找必然成功,且查找次数为1次(因为做表头插入)例如示例数据中输入两次52,第一次查找失败就把52插入到位置8,第二次查找就成功了,所以第一次输出error,第二次就输出8 1
为什么第三次输入52会输出8 2
为什么第三次输入52会输出8 2
因为使用的是头插法,52排在了63后面
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node *next;
Node(int n) {
data = n;
next = NULL;
}
Node() {
data = 0;
next = NULL;
}
Node* insert(int n) { //表头插入
Node *p = new Node(n);
p->next = this;
return p;
}
int search(int find) {
Node *p = this;
int time = 0;
while(p) {
time++; //记录查找次数
if(p->data == find) {
return time;
}
p = p->next;
}
return -1; //查找未成功
}
~Node() {
Node *p = this;
Node *q;
while(p) {
q = p->next;
delete []p;
p = q;
}
}
};
class HashTable {
private:
Node **root;
int size;
public:
HashTable(int s) {
size = s;
root = new Node*[size];
for(int i; i < size; i++) {
root[i] = new Node(0);
}
}
int Hash(int n) {
return n % 11;
}
void insert(int n) {
int hash = Hash(n);
root[hash] = root[hash]->insert(n);
}
void search(int find) {
int hash = Hash(find);
if(root[hash]->search(find) > -1) {
cout<<hash<<" "<<root[hash]->search(find)<<"\n";
} else {
cout<<"error\n";
insert(find);
}
return ;
}
~HashTable() {
delete []root;
}
};
int main() {
int n;
HashTable h(11);
cin>>n;
while(n--) {
int data;
cin>>data;
h.insert(data);
}
int t;
cin>>t;
while(t--) {
int find;
cin>>find;
h.search(find);
}
return 0;
}