2.哈希表的查找 (1)设计哈希函数及处理冲突的方法; (2)键盘输入数据,利用设计的哈希函数及线性探测法生成哈希表; (3)在主函数中设计一个简单的菜单,调试上述算法;
时间: 2024-02-23 17:02:53 浏览: 121
好的,我来回答你的问题。
1. 哈希函数的设计及处理冲突的方法:
哈希函数可以采用取余法,即将关键字除以哈希表的长度,取余数作为该关键字在哈希表中的位置。处理冲突的方法可以采用线性探测法,在发生冲突时,从当前位置向后寻找下一个空闲位置,直到找到为止。
2. 利用设计的哈希函数及线性探测法生成哈希表:
以下是一个简单的示例代码:
```c++
#include <iostream>
using namespace std;
const int MAX_SIZE = 10; // 哈希表的最大长度
int hashTable[MAX_SIZE] = {0}; // 哈希表,用0表示空闲位置
// 哈希函数,采用取余法
int hashFunc(int key) {
return key % MAX_SIZE;
}
// 插入关键字到哈希表中
void insert(int key) {
int pos = hashFunc(key); // 计算关键字在哈希表中的位置
while (hashTable[pos] != 0) { // 如果该位置已经被占用,发生冲突
pos = (pos + 1) % MAX_SIZE; // 采用线性探测法,从当前位置向后寻找下一个空闲位置
}
hashTable[pos] = key; // 将关键字插入到哈希表中
}
// 查找关键字在哈希表中的位置
int search(int key) {
int pos = hashFunc(key); // 计算关键字在哈希表中的位置
while (hashTable[pos] != key) { // 如果该位置不是要查找的关键字,发生冲突
pos = (pos + 1) % MAX_SIZE; // 采用线性探测法,从当前位置向后寻找下一个位置
if (hashTable[pos] == 0 || pos == hashFunc(key)) { // 如果遇到空闲位置或者回到原点,说明该关键字不存在
return -1;
}
}
return pos; // 返回关键字在哈希表中的位置
}
// 输出哈希表中的所有关键字
void print() {
for (int i = 0; i < MAX_SIZE; i++) {
if (hashTable[i] != 0) {
cout << "位置 " << i << ": " << hashTable[i] << endl;
}
}
}
int main() {
int choice, key;
while (true) {
cout << "1. 插入关键字" << endl;
cout << "2. 查找关键字" << endl;
cout << "3. 输出哈希表" << endl;
cout << "4. 退出程序" << endl;
cout << "请选择操作:" << endl;
cin >> choice;
switch (choice) {
case 1:
cout << "请输入要插入的关键字:" << endl;
cin >> key;
insert(key);
break;
case 2:
cout << "请输入要查找的关键字:" << endl;
cin >> key;
if (search(key) == -1) {
cout << "关键字不存在!" << endl;
} else {
cout << "关键字在哈希表中的位置为:" << search(key) << endl;
}
break;
case 3:
print();
break;
case 4:
return 0;
default:
cout << "输入有误,请重新选择!" << endl;
break;
}
}
return 0;
}
```
3. 在主函数中设计一个简单的菜单,调试上述算法:
以上示例代码中已经包含了一个简单的菜单,可以直接运行调试。
阅读全文