实现分离链接散列表的创建,查找和删除代码
时间: 2024-05-13 12:19:45 浏览: 35
下面是基于链表实现的分离链接散列表的创建、查找和删除代码示例:
```c++
#include <iostream>
#include <string>
using namespace std;
class HashNode {
public:
int key;
string value;
HashNode* next;
HashNode(int key, string value) {
this->key = key;
this->value = value;
this->next = nullptr;
}
~HashNode() {
delete next;
}
};
class HashMap {
private:
HashNode** table; // 散列表
int capacity;
public:
HashMap(int capacity) {
this->capacity = capacity;
table = new HashNode*[capacity];
for (int i = 0; i < capacity; i++) {
table[i] = nullptr;
}
}
~HashMap() {
for (int i = 0; i < capacity; i++) {
if (table[i] != nullptr) {
delete table[i];
}
}
delete[] table;
}
int hash(int key) {
return key % capacity;
}
void insert(int key, string value) {
int index = hash(key);
HashNode* node = new HashNode(key, value);
if (table[index] == nullptr) {
table[index] = node;
} else {
HashNode* cur = table[index];
while (cur->next != nullptr) {
cur = cur->next;
}
cur->next = node;
}
}
bool search(int key, string& value) {
int index = hash(key);
HashNode* cur = table[index];
while (cur != nullptr) {
if (cur->key == key) {
value = cur->value;
return true;
}
cur = cur->next;
}
return false;
}
void remove(int key) {
int index = hash(key);
if (table[index] == nullptr) {
return;
}
if (table[index]->key == key) {
HashNode* tmp = table[index];
table[index] = table[index]->next;
tmp->next = nullptr;
delete tmp;
} else {
HashNode* cur = table[index];
while (cur->next != nullptr && cur->next->key != key) {
cur = cur->next;
}
if (cur->next != nullptr && cur->next->key == key) {
HashNode* tmp = cur->next;
cur->next = cur->next->next;
tmp->next = nullptr;
delete tmp;
}
}
}
};
int main() {
HashMap map(10);
map.insert(1, "value1");
map.insert(11, "value11");
map.insert(21, "value21");
map.insert(31, "value31");
map.insert(41, "value41");
map.insert(2, "value2");
map.insert(3, "value3");
map.insert(4, "value4");
map.insert(5, "value5");
map.insert(6, "value6");
string value;
if (map.search(31, value)) {
cout << "Found key 31: " << value << endl;
} else {
cout << "Not found key 31" << endl;
}
map.remove(31);
if (map.search(31, value)) {
cout << "Found key 31: " << value << endl;
} else {
cout << "Not found key 31" << endl;
}
return 0;
}
```
在上面的代码中,`HashNode` 类表示散列表中的一个节点,包含键、值和指向下一个节点的指针。`HashMap` 类表示分离链接散列表,使用 `HashNode*` 指针数组来存储数据,数组中每个元素都是一个链表的头指针,表示散列表中的一个桶。`hash` 方法用于计算给定键的散列值,然后根据散列值找到对应的桶,将新节点插入到链表的末尾。`search` 方法用于查找给定键的值,先计算散列值,然后遍历桶中的链表查找匹配的键。`remove` 方法用于删除给定键的节点,先计算散列值,然后遍历桶中的链表查找匹配的键,如果找到则删除该节点。
在 `main` 函数中,首先创建了一个容量为 10 的散列表,然后插入了 10 个节点。接着通过 `search` 方法查找键为 31 的节点,输出节点的值,然后通过 `remove` 方法删除键为 31 的节点。最后再次通过 `search` 方法查找键为 31 的节点,输出节点的值。
阅读全文