C++开放地址法散列表的存储形式
时间: 2023-12-18 18:03:33 浏览: 69
C++中开放地址法散列表的存储形式可以使用数组来实现。具体来说,需要定义一个数组来存储散列表中的元素,数组的大小等于散列表的容量。
在使用开放地址法解决冲突的过程中,当发生冲突时,需要使用某种方法来寻找下一个可用的位置,直到找到一个空闲位置或者遍历完整个散列表。这里常用的方法包括线性探测法、二次探测法和双重哈希法等。
下面是一个简单的示例代码,实现了基于线性探测法的开放地址法散列表:
```c++
#include <iostream>
using namespace std;
const int CAPACITY = 10; // 散列表容量
// 定义散列表结构体
struct HashTable {
int* data; // 存储数据的数组
int size; // 散列表大小
HashTable() {
size = CAPACITY;
data = new int[size];
for (int i = 0; i < size; i++) {
data[i] = -1; // 初始化散列表,将所有元素设置为-1
}
}
// 哈希函数
int hash(int key) {
return key % size;
}
// 插入元素
void insert(int key) {
int pos = hash(key);
while (data[pos] != -1) { // 线性探测法解决冲突
pos = (pos + 1) % size;
}
data[pos] = key;
}
// 查找元素
bool find(int key) {
int pos = hash(key);
while (data[pos] != -1) { // 线性探测法查找
if (data[pos] == key) {
return true;
}
pos = (pos + 1) % size;
}
return false;
}
// 删除元素
void remove(int key) {
int pos = hash(key);
while (data[pos] != -1) { // 线性探测法查找
if (data[pos] == key) {
data[pos] = -1; // 将该位置的元素标记为删除
return;
}
pos = (pos + 1) % size;
}
}
};
int main() {
HashTable ht;
ht.insert(10);
ht.insert(22);
ht.insert(37);
ht.insert(42);
ht.insert(55);
ht.insert(60);
ht.insert(73);
ht.insert(85);
ht.insert(95);
ht.insert(100);
cout << "散列表中是否存在元素 60:" << ht.find(60) << endl;
ht.remove(60);
cout << "散列表中是否存在元素 60:" << ht.find(60) << endl;
return 0;
}
```
阅读全文