
Реализации различных алгоритмов на Си / Хеширование (int)
.DOC
Задание:
Написать программу, осуществляющую поиск элемента (элементов) в последовательности из входного файла. Имя входного файла вводится пользователем. На экране пользователю должны отображаться исходная последовательность и найденный элемент (элементы) с указанием их номера в последовательности. Формат входного файла – текстовый. Количество записей в файле неограниченно.
Если для алгоритма поиска необходима отсортированная последовательность, то использовать метод из первой лабораторной работы.
Алгоритм поиска:
-
хеширование;
-
целые числа;
-
совпадение;
Алгоритм решения:
-
Считывать последовательность, сразу хешируя и занося в нужную ячейку памяти;
-
Ввести нужный элемент;
-
По хеш – коду найти ему соответствующий в последовательности.
-
Вывести найденный (если есть) элемент и его номер на экран;
Решение:
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
struct data
{
struct data *next;
int base;
int number;
} element, *variable, mas[11], *bridge, find, *following, *cur, *curs;
void main (void)
{
FILE *whence;
int N, i, hash;
char name[40];
puts ("Enter a name of a file, from which the data will be read out:");
scanf ("%s", name);
whence=fopen(name, "r");
puts ("Enter quantity of elements:");
scanf ("%d", & N);
puts ("Enter an element, which you want to find:");
scanf ("%d", & element.base);
puts ("\n");
bridge=(struct data*)malloc(sizeof(struct data));
for (i=0; i<N; i++)
{
fscanf (whence, "%d\n", & bridge->base);
printf ("%d\n", bridge->base);
variable=bridge;
hash=(bridge->base)%11;
if (mas[hash].number==0)
{
mas[hash].base=variable->base;
mas[hash].number=i+1;
mas[hash].next=NULL;
}
else
{
following=&mas[hash];
for (;;)
{
if (following->next==NULL)
{
variable=(struct data*)malloc(sizeof(struct data));
variable->base=bridge->base;
variable->next=NULL;
variable->number=i+1;
following->next=variable;
break;
}
else
following=following->next;
}
}
}
hash=(element.base)%11;
find=mas[hash];
for(;;)
{
if (element.base==find.base)
{
printf ("Required element: %d\n", find.base);
printf ("Number of an element: %d\n", find.number);
if (find.next==NULL)
break;
else
find=*find.next;
}
else
{
if (find.next!=NULL)
find=*find.next;
else
break;
}
}
for (i=0; i<11; i++)
{
if (mas[i].next==NULL)
continue;
else
{
curs=mas[i].next;
if (curs->next!=NULL)
{
for (;;)
{
cur=curs;
if (cur->next==NULL)
{
free (cur);
break;
}
else
{
curs=cur->next;
free (cur);
}
}
}
}
}
free (bridge);
fclose (whence);
getch();
}
Screen short: