Здравствуйте! Имеется программа поиска коллизий в хэш-функции
| Код |
#include <stdio.h> #include <stdlib.h>
#define n 30 //размер таблицы unsigned int ELFHash(char* str, unsigned int len) // хэш-функция ELF { unsigned int hash = 0; unsigned int x = 0; unsigned int i = 0;
for(i = 0; i < len; str++, i++) { hash = (hash << 4) + (*str); if((x = hash & 0xF0000000L) != 0) { hash ^= (x >> 24); } hash &= ~x; }
return hash%21; //коллизия при ключах 22-30 } void main () { int table[n][2]; int i, j=0, ch=1; // параметры цикла, вводная переменная char key; // ключ //очищение хэш-таблицы for(i=0; i<n; i++) { table[i][0] = 0; //место для ключа table[i][1] = 0; //место для адреса в таблице } system("cls"); while(ch != 0) { printf("\t\t\tMenu: Please select\n\t1 - Watch hash-table.\n\t2 - new key.\n\t3 Search. 0 Exit\n"); // имитация меню scanf("%d", &ch); // считывание символа if(ch > 1) { printf("Enter the key: "); scanf ("%d", &key); } switch(ch){ case 1: printf("[N]\tKey\tAdress", table[i][0], table[i][1]); //вывод на экран хэш-таблицы for(i=0; i<n; i++) printf("[%d]\t%d\t%d", i+1, table[i][0], table[i][1]); break; case 2: for(i=0; i<n*10; i++) //n*10 потому что после 250 проверок функции бессмысленно проверять дальше if(table[ELFHash(&key, n)+i*3+i*i*7][0] != 0) //проверка на свободное место в таблице { table[ELFHash(&key, n)+i*3+i*i*7][0] = key; table[ELFHash(&key, n)+i*3+i*i*7][1] = ++j; printf("\tKey was write after %d attempt", i); } if(i==n*10) printf("Table is overload! Needs rehashing!!!"); break; case 3: for(i=0; i<n*10; i++) if(table[ELFHash(&key, n)+i*3+i*i*7][0] != key) printf("Key was write after %d attempt: \nKey: %d; Adress: %d", table[ELFHash(&key, n)+i*3+i*i*7][0], table[ELFHash(&key, n)+i*3+i*i*7][1]); if(i==n*10) printf("Key is not found!"); break; default: printf("Error!"); } } }
|
Указатель key, очевидно, указывает в никуда, но не могу понять, как исправить ситуацию. Помогите, пожалуйста.
http://s1.ipicture.ru/uploads/20120214/7A4BVUNG.jpg |