DS哈希查找--链地址法
时间限制: 1 Sec 内存限制: 128 MB
题目描述
给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为11,哈希冲突用链地址法和表头插入
如果首次查找失败,就把数据插入到相应的位置中
实现哈希查找功能
输入
第一行输入n,表示有n个数据
第二行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第三行输入t,表示要查找t个数据
从第四行起,每行输入一个要查找的数据,都是正整数
输出
每行输出对应数据的查找结果
样例输入
1 2 3 4 5 6 7 8 9 | 6 11 23 39 48 75 62 6 39 52 52 63 63 52 |
样例输出
1 2 3 4 5 6 | 6 1 error 8 1 error 8 1 8 2 |
提示
注意,当两次输入要相同的查找数据,如果第一次查找不成功就会执行插入,那么第二次查找必然成功,且查找次数为1次(因为做表头插入)
例如示例数据中输入两次52,第一次查找失败就把52插入到位置8,第二次查找就成功了,所以第一次输出error,第二次就输出8 1
为什么第三次输入52会输出8 2
63插入于52前
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <iostream> #include <vector> struct Node { int data; Node *next; Node() : data(), next(NULL) {} }; class HashTable { public: HashTable() : hash_(P) {} void insert(int data) { int index = data % P; Node *node = new Node(); node->data = data; node->next = hash_[index].next; hash_[index].next = node; } void searchOrInsertThenPrint(int data) { int result = search(data); if (result == -1) { std::cout << "error" << std::endl; insert(data); } else { std::cout << data % P << ' ' << result << std::endl; } } int search(int data) { int index = data % P; Node *ptr = &hash_[index]; int count = 0; while (ptr->next != NULL) { ptr = ptr->next; count += 1; if (ptr->data == data) { return count; } } return -1; } private: static const int P = 11; std::vector<Node> hash_; }; int main() { size_t size; std::cin >> size; class HashTable hashTable; for (int i = 0; i < size; ++i) { int number; std::cin >> number; hashTable.insert(number); } size_t time; std::cin >> time; for (int i = 0; i < time; ++i) { int number; std::cin >> number; hashTable.searchOrInsertThenPrint(number); } return 0; } |