Hashmap C: руководство по использованию хэш-таблицы в языке C
HashMap в C языке не является стандартной структурой данных, так как C является низкоуровневым языком и не поддерживает встроенные коллекции данных. Однако, можно реализовать собственную хэш-таблицу, которая будет работать аналогично HashMap в других языках.
Реализация хэш-таблицы в C обычно базируется на массиве указателей на структуры данных, называемые бакетами. Каждый бакет содержит ключ и значение. Хэш-функция используется для преобразования ключа в индекс массива. Это позволяет быстро найти нужный элемент по ключу.
Вот пример реализации простой хэш-таблицы в C:
#include
#include
#include
#define SIZE 10
typedef struct {
char key[100];
int value;
} Element;
Element* create_element(const char* key, int value) {
Element* element = (Element*)malloc(sizeof(Element));
strcpy(element->key, key);
element->value = value;
return element;
}
unsigned int hash(const char* key) {
unsigned int hash_value = 0;
unsigned int prime = 31;
for (int i = 0; i < strlen(key); i++) {
hash_value = hash_value * prime + key[i];
}
return hash_value % SIZE;
}
void insert_element(Element** hashtable, const char* key, int value) {
unsigned int index = hash(key);
Element* element = create_element(key, value);
if (hashtable[index] != NULL) {
free(hashtable[index]);
}
hashtable[index] = element;
}
Element* find_element(Element** hashtable, const char* key) {
unsigned int index = hash(key);
return hashtable[index];
}
int main() {
Element** hashtable = (Element**)malloc(SIZE * sizeof(Element*));
for (int i = 0; i < SIZE; i++) {
hashtable[i] = NULL;
}
insert_element(hashtable, "key1", 1);
insert_element(hashtable, "key2", 2);
Element* element1 = find_element(hashtable, "key1");
if (element1 != NULL) {
printf("Value for key1: %d\n", element1->value);
}
Element* element2 = find_element(hashtable, "key2");
if (element2 != NULL) {
printf("Value for key2: %d\n", element2->value);
}
free(hashtable);
return 0;
}
В этом примере мы реализовали простой хэш-таблицы с размером 10. Мы определили структуру Element, которая содержит ключ и значение. У нас есть функция `create_element` для создания нового элемента, функция `hash` для вычисления хэш-значения ключа и функция `insert_element` для вставки элементов в хэш-таблицу.
В функции `main` мы создаем массив указателей на структуру Element и инициализируем его `NULL`. Затем мы вставляем два элемента с ключами "key1" и "key2" и значениями 1 и 2 соответственно. Затем мы ищем эти элементы по ключам и выводим значения.
Обратите внимание, что эта реализация хэш-таблицы довольно проста и не учитывает случаи коллизий, когда два ключа имеют одно и то же хэш-значение. На практике, для обработки коллизий используются различные методы, такие как метод цепочек или открытая адресация. Также, она не содержит функции удаления элементов или изменения значений по ключу, что может быть добавлено в более продвинутой реализации.
Надеюсь, это поможет вам понять, как реализовать простую хэш-таблицу в C.