Сначала вы должны подумать о своей стратегии коллизий:
- Будет ли у вас несколько хеш-функций?
- Или вам придется использовать контейнеры внутри хеш-таблицы?
Мы выберем 1.
Затем вы должны выбрать красиво распределенную хеш-функцию.Например, мы выберем
int hash_fun(int key, int try, int max) {
return (key + try) % max;
}
Если вам нужно что-то лучше, возможно, взгляните на метод среднего квадрата .
Затем вам нужно будет решить, что такое хеш-таблица.
struct hash_table {
int max;
int number_of_elements;
struct my_struct **elements;
};
Затем нам нужно будет определить, как вставлять и получать.
int hash_insert(struct my_struct *data, struct hash_table *hash_table) {
int try, hash;
if(hash_table->number_of_elements >= hash_table->max) {
return 0; // FULL
}
for(try = 0; true; try++) {
hash = hash_fun(data->key, try, hash_table->max);
if(hash_table->elements[hash] == 0) { // empty cell
hash_table->elements[hash] = data;
hash_table->number_of_elements++;
return 1;
}
}
return 0;
}
struct my_struct *hash_retrieve(int key, struct hash_table *hash_table) {
int try, hash;
for(try = 0; true; try++) {
hash = hash_fun(key, try, hash_table->max);
if(hash_table->elements[hash] == 0) {
return 0; // Nothing found
}
if(hash_table->elements[hash]->key == key) {
return hash_table->elements[hash];
}
}
return 0;
}
И хотя бы метод удаления:
int hash_delete(int key, struct hash_table *hash_table) {
int try, hash;
for(try = 0; true; try++) {
hash = hash_fun(key, try, hash_table->max);
if(hash_table->elements[hash] == 0) {
return 0; // Nothing found
}
if(hash_table->elements[hash]->key == key) {
hash_table->number_of_elements--;
hash_table->elements[hash] = 0;
return 1; // Success
}
}
return 0;
}