Ошибка времени выполнения в строке 25: Char 35: ошибка времени выполнения: доступ к элементу внутри нулевого указателя типа struct HASH_TABLE (решение. c) - PullRequest
0 голосов
/ 07 февраля 2020
#define SIZE 50

typedef struct{
    int key;
    int value;
}HASH_TABLE;

HASH_TABLE* hashArray[SIZE];

int hashCode(int key) {
   return key % SIZE;
}

bool containsDuplicate(int* nums, int numsSize){

    int count = 1,i=0;

    HASH_TABLE* data  = (HASH_TABLE*)malloc(sizeof(HASH_TABLE*));
    data->value = count;

    for(i=0;i<numsSize;i++)
    {
        int hashIndex = hashCode(nums[i]);
        hashArray[hashIndex]->key = nums[i];
        hashArray[hashIndex]->value = data->value;

        ++hashIndex;
        hashIndex %= SIZE;

        if(hashArray[hashIndex]->key == nums[i])
        {
            data->value++;
        }



    }
    if(data->value>0)
        return true;

    return false;
}

Я пытаюсь написать код для поиска дубликатов, используя алгоритм таблицы ha sh в C.

Код должен работать следующим образом

При наличии массива целые числа, найдите, если массив содержит дубликаты.

Ваша функция должна возвращать true, если какое-либо значение встречается в массиве хотя бы дважды, и возвращать false, если каждый элемент отличается.

Пример 1:

Вход: [1,2,3,1] Выход: true Пример 2:

Вход: [1,2,3,4] Выход: false Пример 3:

Входные данные: [1,1,1,3,3,4,3,2,4,2] Выходные данные: true

, пожалуйста, помогите мне исправить мою ошибку

Спасибо

1 Ответ

0 голосов
/ 14 февраля 2020

В вашем коде есть несколько ошибок:

  • Вы дали место только для одного значения для каждой записи ha sh в таблице. Это означает, что вы сравниваете числа только по их значению га sh, а не по их целочисленным значениям. Допустим, вы вводите 1 и позже у вас есть 51. Оба имеют одинаковое значение ha sh, так как вы вычисляете остаток по модулю 50 как значение ha sh, поэтому они будут go в одной записи таблицы (запись с индексом 1), это вторая запись. Когда вы читаете число 51, вы меняете значение в поле data на 51, и, если позже прибудет еще один 1, вы потеряете его как первое 1, которое у вас было прежде, просто вылетел, когда вы добавили номер 51. Таблица ha sh позволяет вам получить более быстрый доступ, но вы должны хранить все имеющиеся у вас ключи, несмотря на значение ha sh, которое они имеют. Таким образом, каждая запись таблицы должна поддерживать список записей со значением ha sh, значение x, и в списке должны быть все записи, которые имеют одинаковые значения ha sh, и сравнить отдельные ключи, чтобы увидеть, какой из них вы сравнение.
  • Вы должны использовать malloc(sizeof *data) или malloc(sizeof(HASHTABLE)), лучше, чем то, что вы делаете. В вашем коде вы выделяете байты для хранения указателя (вы указываете размер указателя, а не размер записи). sizeof *data - это размер указанных данных (да, вы можете использовать его после оператора sizeof, даже если он еще не был выделен, компилятор не интересуется указанным значением, просто размером данных это)
  • Никогда, никогда никогда, приведите значение, возвращенное из malloc(3). Это не то, что вы хотите. Это позволяет вам забыть #include <stdlib.h> (где указан правильный прототип malloc(3)) и, таким образом, скрыть дальнейшие ошибки, и это гораздо опаснее, чем ошибка, которую вы хотите избежать. Mallo c всегда возвращает указатель, но если вы не используете прототип (и это происходит, если вы преобразовали возвращенное значение и забыли в #include <stdlib.h>, компилятор предположит, что malloc() возвращает int (что не соответствует действительности) и будет генерировать код для преобразования возвращенного значения в указатель в HASH_TABLE, и это будет sh данных, возвращаемых malloc() в лучшем случае. В 64-битной архитектуре указатели являются 64-битными, в то время как целые числа только 32. В этой архитектуре значение, возвращаемое mallo c, имеет ширину 64 бита ... компилятор сгенерирует код для преобразования 32-битных (неопределенного поведения) 32-битных данных и преобразует его (расширяя с помощью неопределенного Поведение) данных на 64 бита и создание указателя с (неопределенным поведением) этих данных. Скорее всего, вы получите ошибку сегментации и программу cra sh, когда попытаетесь использовать указатель для чего-то еще, кроме печати его значения .
  • если вы используете такую ​​простую функцию ha sh, тогда вам лучше использовать простое число для Количество элементов в таблице ha sh, поэтому некоторые записи не будут заполнены данными, тогда как другие будут пустыми. Использование простого числа позволяет лучше распределять числа (хотя лучше выбрать табличную функцию ha sh)
...