[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