Структура данных карты и «столкновение» не могут быть разделены.то, как вы начали свою реализацию, выглядит хорошо, вот как вы должны обрабатывать коллизии:
Добавление новой записи в карту
- вычисление
hashcode
для key
- вычислить
index
из хеш-кода (более или менее index
= hashcode value
% size of keyset
) - , если
keyset[index]
не равно нулю - , еслинабор ключей [index]! = ключ (т. е. для строк, используйте strcmp) увеличение
index
модуль size of keyset
, затем перейти к 3
- положить
value
в entryset[index]
Получение значения с карты
- вычисление
hashcode
для key
- вычисление
index
из хеш-кода (подробнееили меньше index
= hashcode value
% size of keyset
) - , если
keyset[index]
не равно нулю - , если keyset [index]! = key (т. е. для строк, используйте strcmp)приращение
index
модуль size of keyset
, затем перейти к 3
- , если
keyset[index]
равно нулю, вернуть нуль - вернуть
entryset[index]
Удаление записи с карты
- Рассчитать
hashcode
для key
- вычисление
index
из хеш-кода (более или менее index
= hashcode value
% size of keyset
) - , если
keyset[index]
не равно нулю - , если набор ключей [индекс]! = ключ (т.е.для строк используйте strcmp) приращение
index
модуль size of keyset
, затем перейдите к 3
- установите
keyset[index]
и entryset[index]
в ноль
какВы можете видеть, вы можете поместить шаги с 1 по 3 в функцию int findIndexFromKey(Map *map, char *key);
, и большая часть работы сделана
** EDIT **
Конечно,Вы также должны проверить, не заполнена ли ваша карта, до (или во время) добавления новой записи, иначе вы просто будете бесконечно зацикливаться.