Я пытаюсь написать правильную функцию удаления для моей хэш-таблицы, используя метод разрешения столкновений с линейным зондированием.
Я запускаю тестер, который удаляет несколько записей из моей хеш-таблицы. В определенный момент моя функция поиска не может найти элемент для удаления. Тем не менее, он должен быть еще в таблице. Я думаю, что я делаю мою перефразировку в remove () неправильно.
Учебный класс HashTable
содержит член table
, массив структур типа Record
template <class TYPE>
struct Record{
string key;
TYPE value = NULL;
Record(){
key = "";
value = 0;
}
Record(const char* key_, TYPE value_){
key = key_;
value = value_;
}
Record(string key_, TYPE value_){
key = key_;
value = value_;
}
};
template <class TYPE>
bool HashTable<TYPE>::remove(const char* key){
int tvalue; //temporary unused value to make find work
if (find(key, tvalue))
{
table[lastFoundIdx].key = ""; //lastFoundIdx - index of element that contains a key
table[lastFoundIdx].value = 0;
numRec--; //reduce number of records in table
int startIdx = lastFoundIdx; //rehash will stat form start Index
int i;
if (lastFoundIdx == maxSize - 1)
i = 0;
else
i = lastFoundIdx + 1;
while (table[i].key != ""&&i != maxSize){ // rehash starts here
std::size_t h1 = std::hash<std::string>()(table[i].key);
int hash = h1%maxSize;
if (hash < i&&hash >= startIdx){
table[startIdx].key = table[i].key;
table[startIdx].value = table[i].value;
table[i].key = "";
table[i].value = 0;
startIdx = i;
}
i++;
}
return true;
}
else return false;
}
Вот также моя функция поиска, которая, кажется, работает нормально, но я могу ошибаться
template <class TYPE>
bool HashTable<TYPE>::find(const char* key, TYPE& value){
std::size_t h1 = std::hash<std::string>()(key);
int hash = h1%maxSize;
int startIdx = hash;
while (table[hash].key != "" && table[hash].key != key){
hash = (hash + 1) % maxSize;
if (hash == startIdx)
return false;
}
if (table[hash].key == "")
return false;
else{
lastFoundIdx = hash;
value = table[hash].value;
return true;
}
}
Не могли бы вы помочь мне определить, правильно ли я выполняю удаление для линейного зондирования?
Задача ещё не решена.