Хеш-таблица
Не получается написать функцию построения хеш-таблицы со страстающимися цепочками, без цепочки свободных членов. Располагаются все приходящие ключи верно, а вот с ссылками цепуха какая-то происходит. Собственно вопрос, где ошибка?)
P.S. Заменять массивы на vector - не вариант, ибо пишем без использования stl.
P.P.S. Как нормально код отформатировать тут? А то что-то все налево выравнилось(
void make ( int *keys, int *links, int dim)
//keys - массив ключей, links - соответствуюзие ссылки. dim - размер таблицы
{
int key,adr;
cout << "Enter key of element ";
cin >> key;
while (key!=0)
{
adr=get_adress(key); // вовзращает остаток от деления ключа на 10.
cout << "Key's adress is " << adr;
if(keys[adr]==0)
{
cout << "\nThis adress is empty ";
keys[adr]=key;
links[adr]=-1; // no link
}
else //ячейка, куда нужно записать ключ, занята
{
int k,p=0, tmp_link=adr, parent_n;
for (k=adr;p==0||k==dim;k++)
{
if (adr==get_adress(keys[k]))
//если в ячейке уже есть ключ, который так же должен располагаться по адресу adr ( пример 11,21)
{
links[k]=adr+k;
tmp_link=k;
//parent_n=0;
}
if(keys[k]==0) //если найдена пустая ячейка
{
cout<< "\nNext empty adress is " << k;
if (links[adr]==-1)
links[adr]=tmp_link;
keys[k]=key;
links[k]=-1;
p=1;
}
if (k==dim) //если достигнут конец таблицы
cout << "\nNo free space in hash-table ";
}
}
cin>>key;
}
}
.
P.S. Заменять массивы на vector - не вариант, ибо пишем без использования stl.
P.P.S. Как нормально код отформатировать тут? А то что-то все налево выравнилось(
void make ( int *keys, int *links, int dim)
//keys - массив ключей, links - соответствуюзие ссылки. dim - размер таблицы
{
int key,adr;
cout << "Enter key of element ";
cin >> key;
while (key!=0)
{
adr=get_adress(key); // вовзращает остаток от деления ключа на 10.
cout << "Key's adress is " << adr;
if(keys[adr]==0)
{
cout << "\nThis adress is empty ";
keys[adr]=key;
links[adr]=-1; // no link
}
else //ячейка, куда нужно записать ключ, занята
{
int k,p=0, tmp_link=adr, parent_n;
for (k=adr;p==0||k==dim;k++)
{
if (adr==get_adress(keys[k]))
//если в ячейке уже есть ключ, который так же должен располагаться по адресу adr ( пример 11,21)
{
links[k]=adr+k;
tmp_link=k;
//parent_n=0;
}
if(keys[k]==0) //если найдена пустая ячейка
{
cout<< "\nNext empty adress is " << k;
if (links[adr]==-1)
links[adr]=tmp_link;
keys[k]=key;
links[k]=-1;
p=1;
}
if (k==dim) //если достигнут конец таблицы
cout << "\nNo free space in hash-table ";
}
}
cin>>key;
}
}
.
