c - 删除项目 - 哈希表

标签 c data-structures hashtable

我正在做一个项目,将 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/

相关文章:

c - 我的多项式加法 c 代码有什么问题?

c++ - 指针和架构的大小

java - 调用 get 方法时来自 java.util.Hashtable 的 AbstractMethodError

java - 防止哈希表转换为 ASCII

c - 为什么我的程序不能将偶数除以二?

c - 没有强制类型转换错误的链表指针

c - C 中的二叉树 - 问题

php - 多类(class)、相互关联的学校时间表作为 MySQL 数据库

c++ - 使用幻灯片而不是交换进行冒泡排序

java - 如何减少哈希冲突?