DS哈希查找–链地址法(表头插入)
题目描述
给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为11,哈希冲突用链地址法和表头插入
如果首次查找失败,就把数据插入到相应的位置中
实现哈希查找功能
输入
第一行输入n,表示有n个数据
第二行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第三行输入t,表示要查找t个数据
从第四行起,每行输入一个要查找的数据,都是正整数
输出
每行输出对应数据的查找结果
输入样例:
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
参考代码:
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <forward_list>
using namespace std;
int main() {
int n, t;
cin >> n;
int *arr = new int[n];
forward_list<int> Hash[11];
for (int i = 0; i < n; ++i) {
cin >> arr[i];
Hash[arr[i] % 11].push_front(arr[i]);
}
cin >> t;
while (t--) {
int num;
cin >> num;
if (find(Hash[num % 11].begin(), Hash[num % 11].end(), num) == Hash[num % 11].end()) {
Hash[num % 11].push_front(num);
cout << "error" << endl;
} else {
cout << num % 11 << ' '
<< distance(Hash[num % 11].begin(), find(Hash[num % 11].begin(), Hash[num % 11].end(), num)) + 1
<< endl;
}
}
return 0;
}