【发布时间】:2019-05-11 01:56:18
【问题描述】:
这是我第一次尝试实现哈希表。我正在阅读一些指南,但似乎不对。对于我所有的功能,我必须创建一个新的 int 然后使用它?
对于我所有的函数调用,我正在创建一个“int hi”。并使用它来散列我正在制作的任何密钥。这是设置哈希表的正确方法吗? 我找不到那么多解释如何正确设置哈希表和正确映射键的指南。
我仍在处理整个代码,但我不想继续。我很确定我缺少一些东西。在每个函数调用中创建新的整数和字符串对我来说似乎很离谱。
下面是我正在处理的代码。
#include <iostream>
using namespace std;
class HashTable
{
struct Element
{
string key;
int mark;
};
Element** table;
int size;
private:
int hash(string);
public:
HashTable(int);
~HashTable();
void insert(string);
void remove(string);
bool isFull();
bool isEmpty();
void clear();
void print();
bool find(string);
};
int HashTable::hash(string s)
{
return 0;
}
HashTable::HashTable(int s)
{
int hi;
table = new Element *[s];
for (int i = 0; i < size; i++)
{
table[hi] = NULL;
}
}
HashTable::~HashTable()
{
int hi;
for (int i = 0; i < size; i++)
{
if (table[hi])
delete table[hi];
}
delete[]table;
}
void HashTable::insert(string s)
{
string key;
int hi;
if (!isFull)
{
hi = hash(key);
while (table[hi]->mark == 1)
{
hi = (hi + 1) % size;
}
table[hi]->key = key;
table[hi]->mark = 1;
}
}
void HashTable::remove(string s)
{
string key;
int i;
int hi;
if (!isEmpty)
{
hi = hash(key);
i = 0;
}
while (i < size && table[hi]->mark != 0)
{
if (table[hi]->key == key)
{
table[hi]->mark = 2;
break;
}
i = i + 1;
hi = (hi + 1) % size;
}
}
bool HashTable::isFull()
{
int hi;
if (table[hi] >= size)
{
return true;
}
}
bool HashTable::isEmpty()
{
int hi;
if (table[hi] >= size)
{
return true;
}
}
void HashTable::clear()
{
int hi;
for (int i = 0; i < size; i++)
{
delete table[hi];
table[hi] = nullptr;
}
}
void HashTable::print()
{
int hi;
string key;
for (int i = 0; i < size; ++i)
{
if (table[hi]->mark == 2)
{
printf("test \n", table[hi]->key);
}
}
}
bool HashTable::find(string s)
{
string key;
int i;
int found;
int hi;
if (!isEmpty)
{
hi = hash(key);
found = false;
}
i = 0;
while (table[hi]->mark != 0 && (!found) && i < size)
{
if (table[hi]->mark == 1 && table[hi]->key == key)
{
found = true;
}
hi = (hi + 1) % size;
i = i + 1;
}
return found;
}
【问题讨论】:
-
注意,您的循环使用
i作为索引,但在循环内部您使用未初始化的hi变量。 UB放心...
标签: c++ arrays hash hashmap hashtable