Во-первых, давайте исправим ваш конструктор:
HashTable::HashTable(int s)
{
table = new Element*[s];
size = s; // you forgot this line
for (int i = 0; i < size; i++)
{
table[i] = NULL; // "i", not "hi"
}
}
Вы хотите, чтобы ваша операция хеширования отображала любую уникальную строку в число (по модулю размера массива вашей хеш-таблицы):
Выможет сделать это:
size_t HashTable::hash(const string& s)
{
size_t hashvalue = 0;
for (char ch : s)
{
hashvalue += (unsigned)ch;
}
return (hashvalue % size);
}
Сам C ++ имеет встроенный алгоритм хеширования, который, вероятно, имеет лучшую диффузию и распределение:
size_t HashTable::hash(const string& s)
{
std::hash<string> hasher;
size_t hi = hasher(s) % size;
return hi;
}
Это ближе к тому, что вы хотите для элементатип:
struct Element
{
string key;
Element* next;
};
Следовательно, вставка может быть просто такой:
void insert(const string& key)
{
size_t hi = hash(key);
Element* e = Lookup(key);
if (e == nullptr)
{
e = new Element();
e->key = key;
e->value = value;
e->next = table[hi];
table[hi] = e;
}
else
{
// item already exists
}
}
И поиск:
Element* Lookup(const string& key)
{
Element* e = nullptr;
size_t hi = hash(key);
e = table[hi];
while (e && e->key != key)
{
e = e->next;
}
return e;
}
И удаление аналогично операции поиска
void HashTable::remove(const string& key)
{
size_t hi = hash(key);
Element* e = table[hi];
Element* prev = nullptr;
while (e && e->key != key)
{
prev = e;
e = e->next;
}
if (e && prev)
{
prev->next = e->next;
delete e;
}
else if (e)
{
table[hi] = e->next;
delete e;
}
}
Я оставлю остальные методы вашего класса в качестве упражнения для вас.