C 删除项-哈希表
我正在做一个项目,将28*28数组形成的图像ID放入hashtable(使用单独的链接解决冲突),该数组只存储在1D数组中。 Hashatable是指向包含图像及其ID的节点的指针数组。get函数返回ID,它工作正常,除非我删除特定图像,然后尝试获取它。。。一个无限循环被生成,旧ID仍然存在C 删除项-哈希表,c,data-structures,hashtable,C,Data Structures,Hashtable,我正在做一个项目,将28*28数组形成的图像ID放入hashtable(使用单独的链接解决冲突),该数组只存储在1D数组中。 Hashatable是指向包含图像及其ID的节点的指针数组。get函数返回ID,它工作正常,除非我删除特定图像,然后尝试获取它。。。一个无限循环被生成,旧ID仍然存在 int get(image img) { int i = hashCode(img); if(hashtable[i]) { Node* temp = hashtab
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-get(图像img)
{
int i=哈希代码(img);
if(哈希表[i])
{
节点*temp=哈希表[i];
//打印要删除的ID
printf(“%d\n\n”,temp->info.key);
int-found;
while(临时)
{``//无限循环
发现=1;
对于(i=0;iinfo.data.img\u arr[i]!=img.img\u arr[i])
{
发现=0;
打破
}
}`
如果(找到==0)
{
温度=温度->下一步;
}
其他的
{
返回temp->info.key;
}
}
}
返回-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;
}
int removi(图像img)
{Node*prev=NULL;
int i=哈希代码(img);
if(哈希表[i])
{Node*temp=hashtable[i];
int-found;
while(临时)
{found=1;
对于(i=0;iinfo.data.img\u arr[i]!=img.img\u arr[i])
{found=0;
打破
}
}
如果(找到==0)
{prev=temp;
温度=温度->下一步;
}否则{
int value=temp->info.key;
如果(上一个){
上一个->下一个=临时->下一个;
}否则{
哈希表[i]=temp->next;
//正确打印下一个节点的ID
printf(“%d in remove\n”,哈希表[i]->info.key);
}
免费(临时);
返回值;
}
}
}
返回-1;
}
在removi
函数中,您正在重用索引值i
。值inti=hashCode(img)代码>稍后由for循环修改:for(i=0;iYou可以通过使用for()循环、早期返回以及不使用found
指示符变量来大大简化逻辑。而且,指向指针的指针也会有所帮助。