[cdev] hash table
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Пн Янв 24 20:47:08 MSK 2011
Теперь замечания.
1. Несколько небрежное оформление. Стиль не выдержан. Между бинарными
операторами где-то есть пробелы, где-то их нет.
Например, в default_compare():
if (a>b)
return 1;
...
в hash_rebuild() уже так:
if (hash->size < prime[i]) {
...
2. Вам не совсем понятно где в Си используется (;) а где нет. Он
обозначает конец конструкции, у которой нет явных разделителей.
Например, в управляющей конструкции if-else, циклах for, while они есть,
это фигурные скобки ({) и (}). Тело функции тоже помещается в блок, он
начинается и заканчивается тоже фигурными скобками. Поэтому там не нужен
(;).
Здесь не нужно ставить (;) везде.
while(b->key != key) {
if (b->next == NULL){
return -1;
}else{
b = b->next;
};
};
Должно быть так:
while (b->key != key) {
if (b->next == NULL) {
return -1;
} else {
b = b->next;
}
}
3. Параметры для public функций нужно проверять (если это возможно) ДО
того как вы их начнёте использовать.
int hash_table_insert(struct hash_table *table, void *key, void *data)
{
unsigned int idx;
if (table->count < (table->collisions * 2)) {
hash_rebuild(table);
}
if (table == NULL) {
return -1;
}
...
То что table у вас NULL -- вы проверяете после того как уже
разыменовывали поля этой структуры по этому адресу. Это некорректно.
Наверное стоило проверять коллизии иначе, было бы яснее.
float coef;
...
coef = (float)table->count / (float)table->collisions;
if (coef <= 2.0)
hash_rebuild(table);
4. При удалении таблицы память выделенная для коллизионных ведёр
"утечёт". Смотрите что писал Егор (rg-400@) внимательнее, там всё есть.
5. Боюсь что вы не проверяли функции, потому что в тестах у вас они все
не вызываются. Вы должны написать (подумать) тесты, чтобы проверить как
они у вас работают -- то что вы написали.
6. hash_table_iterate_deinit() -- не нашёл реализацию. Забыли сделать?
Если замечу ещё что-то, напишу. Доделать осталось чуть-чуть.
--
Г.А.
Денис Мысов пишет:
> Григорий Александрович, проверьте пожалуйста.
> Все функции проверили, все работает.
> Авторы: Мысов Денис, Калаев Алексей, Сергей Кожеванов.
Подробная информация о списке рассылки cdev