Удалить элемент - хеш-таблицу - PullRequest
0 голосов
/ 04 мая 2018

Я работаю над проектом по добавлению хеш-таблицы (разрешение конфликтов с помощью отдельной цепочки) идентификаторов изображений, сформированных из массива 28 * 28, хранящегося только в одномерном массиве. Hashatable - это массив указателей на узел, который содержит изображение и его идентификатор. Функция get возвращает 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;
}

1 Ответ

0 голосов
/ 04 мая 2018

В вашей функции removi вы повторно используете значение индекса i. Значение int i = hashCode(img); будет позже изменено вашим циклом for: for(i =0; i<sizeOfFile; i++);

Поэтому ваша строка для удаления элемента (когда это элемент head в вашем списке): hashtable[i]=temp->next; фактически не удаляет его - вместо этого он запускает какой-то другой список или вызывает неопределенное поведение, если i выходит за границы.

...