Я работаю над проектом по помещению в хеш-таблицу (разрешение конфликтов с отдельной цепочкой) идентификаторов изображений, сформированных из массива 28 * 28, хранящихся только в одномерном массиве. Hashatable - это массив указателей на узел, содержащий изображение и его идентификатор. Функция get возвращает идентификатор, и он работает отлично, за исключением случаев, когда я удаляю конкретное изображение, а затем пытаюсь его получить ... создается бесконечный цикл, а старый идентификатор все еще там !!
int get(image img)
{
int i = hashCode(img);
if (hashtable[i])
{
Node* temp = hashtable[i];
//prints the ID which is suposed to be deleted
printf("%d\n\n",temp->info.key);
int found ;
while(temp)
{` `//infinite loop
found = 1;
for(i =0; i<sizeOfFile; i++)
{
if (temp->info.data.img_arr[i]!=img.img_arr[i])
{
found = 0;
break;
}
}`
if (found==0)
{
temp = temp->next;
}
else
{
return temp->info.key;
}
}
}
return -1;
}
функция возврата
int removi(image img)
{ Node*prev=NULL;
int i = hashCode(img);
if (hashtable[i])
{ Node* temp = hashtable[i];
int found ;
while(temp)
{ found = 1;
for(i =0; i<sizeOfFile; i++)
{ if (temp->info.data.img_arr[i]!=img.img_arr[i])
{ found = 0;
break;
}
}
if (found==0)
{ prev = temp;
temp = temp->next;
}else{
int value = temp->info.key;
if (prev){
prev->next = temp->next;
}else{
hashtable[i]=temp->next;
//prints correctly the ID of next Node
printf("%d in remove\n",hashtable[i]->info.key);
}
free(temp);
return value;
}
}
}
return -1;
}





В вашей функции removi вы повторно используете значение индекса i. Значение int i = hashCode(img); позже будет изменено вашим циклом for: for(i =0; i<sizeOfFile; i++);
Поэтому ваша строка для удаления элемента (когда он является элементом головы в вашем списке): hashtable[i]=temp->next;
на самом деле не удаляет его - вместо этого он портит какой-то другой список или вызывает неопределенное поведение, если i выходит за границы.
Вы можете значительно упростить свою логику, используя циклы for (), ранние возвраты и не используя индикаторную переменную
found. И указатель на указатель также может помочь.