我正在做一个项目,将 28*28 数组形成的图像 ID 放入哈希表(解决与单独链接的冲突),仅存储在一维数组中。 Hashatable 是指向 Node 的指针数组,其中包含图像及其 ID。 get 函数返回 ID 并且它完美地工作,除非我删除特定图像然后尝试获取它...生成无限循环并且旧 ID 仍然存在!!
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
,它会破坏一些其他列表或调用未定义的行为。超出范围。
关于c - 删除项目 - 哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50164587/