Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除项-哈希表_C_Data Structures_Hashtable - Fatal编程技术网

C 删除项-哈希表

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

我正在做一个项目,将28*28数组形成的图像ID放入hashtable(使用单独的链接解决冲突),该数组只存储在1D数组中。 Hashatable是指向包含图像及其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-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
指示符变量来大大简化逻辑。而且,指向指针的指针也会有所帮助。