自选哈希函数,自选解决哈希碰撞的方法。 构建myHash.cpp和myHash.h MyHash(int max_element); 构造哈希表 ~MyHash(); 析构函数 void setvalue(int key,int value); 将哈希表中键值为key的元素设定值改为value int getvalue(int key); 获得哈希表中键值为key的元素的对应value值
时间: 2024-02-03 20:13:25 浏览: 74
下面是一个简单的哈希表实现,使用链表解决哈希碰撞问题。
myHash.h 文件:
```c++
#ifndef MY_HASH_H
#define MY_HASH_H
class MyHash {
public:
MyHash(int max_element);
~MyHash();
void setvalue(int key, int value);
int getvalue(int key);
private:
struct Node {
int key;
int value;
Node* next;
Node(int k, int v) : key(k), value(v), next(nullptr) {}
};
Node** table;
int table_size;
int hash_function(int key);
};
#endif
```
myHash.cpp 文件:
```c++
#include "myHash.h"
#include <cstdlib>
MyHash::MyHash(int max_element) {
// 初始化哈希表
table_size = max_element * 2;
table = new Node*[table_size];
for (int i = 0; i < table_size; i++) {
table[i] = nullptr;
}
}
MyHash::~MyHash() {
// 销毁哈希表
for (int i = 0; i < table_size; i++) {
Node* node = table[i];
while (node != nullptr) {
Node* next = node->next;
delete node;
node = next;
}
}
delete[] table;
}
void MyHash::setvalue(int key, int value) {
int index = hash_function(key);
Node* node = table[index];
while (node != nullptr) {
if (node->key == key) {
node->value = value;
return;
}
node = node->next;
}
// 如果没有找到相同的键,则创建一个新节点
node = new Node(key, value);
node->next = table[index];
table[index] = node;
}
int MyHash::getvalue(int key) {
int index = hash_function(key);
Node* node = table[index];
while (node != nullptr) {
if (node->key == key) {
return node->value;
}
node = node->next;
}
// 如果没有找到相应的键,则返回 0
return 0;
}
int MyHash::hash_function(int key) {
// 这里使用简单的取模运算作为哈希函数
return abs(key % table_size);
}
```
使用示例:
```c++
#include "myHash.h"
#include <iostream>
int main() {
MyHash hash(10);
hash.setvalue(1, 100);
hash.setvalue(2, 200);
hash.setvalue(3, 300);
std::cout << hash.getvalue(1) << std::endl; // 输出 100
std::cout << hash.getvalue(2) << std::endl; // 输出 200
std::cout << hash.getvalue(3) << std::endl; // 输出 300
return 0;
}
```
注意,这个实现还有一些缺陷,比如没有考虑到动态调整哈希表大小的问题。为了实现一个更完善的哈希表,还需要考虑并解决这些问题。
阅读全文