Вы хотите остановить цикл, когда вы дойдете до конца массива: для этого вы устанавливаете элемент для поиска равным нулю:
if (searchInt == size2 - 1)
{
searchInt = 0;
cout << "if loop \n";
}
Но в элементе управления цикла вы непроверить это. Вы проверяете только элемент массива с текущим индексом на ноль (не найден) или элемент для поиска (найден):
while ((arr2[searchInt] != 0) && (arr2[searchInt] != randSearchItem)) ...
Вам необходим дополнительный тест:
while ((searchInt != 0) && ...) ...
ItМне потребовалось некоторое время, чтобы понять, что вы хотите написать код с открытым адресом, где ноль обозначает неиспользуемые слоты. Хэш-значение - это просто само число. Использование нуля в качестве индикатора для пустого слота не является идеальным: вы не можете хранить числа, хеш-код которых по модулю равен размеру таблицы.
Я бы также кодировал это с помощью функции non-void, где возвращаемое значение - этоindex или какое-то однозначное значение, означающее «not found», возможно -1. (В качестве альтернативы, вы можете вернуть указатель на найденный элемент или NULL
, если элемент не найден - в конце концов, индекс в массиве хеш-функции является частью внутренних элементов хеш-таблицы и не имеет отношения к вызывающей стороне.)
Тогда вы можете использовать ранние возвраты:
int hashSearch(const int *arr2, int size2, int item)
{
int i = item % size2;
for (; i < size2; i++) {
if (arr2[i] == -1) break; // -1 indicated unused space
if (arr2[i] == item) return i; // return index of item
}
return -1; // not found!
}
Но что вы будете делать, если нет места для дополнительного элемента, когда у вас есть хэш-код, близкий к размеру массива? Вам нужно будет добавить дополнительное пространство в конце или вам нужно будет обернуться вокруг. Возможно, именно этого вы хотели добиться, установив индекс на ноль. В вашем случае массив заполнен, поэтому нет нулей, которые могли бы служить критерием разрыва цикла. Вам нужно будет найти другой критерий. Вы можете убедиться, что есть нули, сделав хеш-таблицу примерно на 30% больше, чем количество записей. Или вы можете попытаться определить, прошел ли индекс полный круг по отношению к исходному индексу.
Как уже отмечалось в комментариях: попробуйте использовать аргументы функций и локальные переменные, а не помещать все в глобальное пространство. Кроме того, цепочка вызовов функций, когда последним в функции является вызов следующего, странная. Вероятно, лучше поместить все последовательные вызовы в main.