Вы находитесь на странице: 1из 4

Белорусский государственный университет

информатики и радиоэлектроники

Кафедра экономический информатики

Основы алгоритмизации и программирования

Хеширование

Вариант 5

Студент Рушева М.В.


Группа 972304

Минск,2020
1)задание
Создать хеш-таблицу со случайными целыми ключами и найти
запись с максимальным ключом.
2)код

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>;

typedef struct {
int* hashTable;
int* used;
}HashTab;

void Init_Table(HashTab* T, int Size);


void Free_Table(HashTab* T);
int hashF(int v, int Size);
int ReHash(int idx, int i, int Size);
int Add(HashTab* T, int n, int Size);
void print_Table(HashTab T, int Size);
int find_key_value(HashTab T, int Size, int* key, int* value);

int main()
{
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int i, Size = 20;
HashTab T;
int key, value;
srand(time(NULL));
Init_Table(&T, Size);
printf("Случайные значения: ");
for (i = 0; i < Size - rand() % 10; i++) {
value = rand() % (Size + 20);
printf("%d ", value);
Add(&T, value, Size);
}
printf("\nХеш-таблица\n");
print_Table(T, Size);
if (find_key_value(T, Size, &key, &value)) {
printf("\nЗапись с максимальным ключом:");
printf("ключ=%d\tзначение=%d\n", key, value);
}
else {
printf("\nТаблица пуста!\n");
}
Free_Table(&T);
return 0;
}
int find_key_value(HashTab T, int Size, int* key, int* value) {
int i;
for (i = Size - 1; i >= 0; i--) {
if (T.used[i]) {
*key = i;
*value = T.hashTable[i];
return 1;
}
}
return 0;
}

void print_Table(HashTab T, int Size) {


int i;
printf("|%8s|%8s|\n", "Ключ", "Значение");
for (i = 0; i < Size; i++) {
if (T.used[i]) {
printf("|%8d|%8d|\n", i, T.hashTable[i]);
}
else
printf("|%8s|%8s|\n", "Null", "Null");
}
}

void Free_Table(HashTab* T) {
free((*T).used);
free((*T).hashTable);
}

int Add(HashTab* T, int n, int Size) {


int index = hashF(n, Size);
int i = 0;
int Count = 0;
while (i <= Size - 1 && (*T).used[index] && (*T).hashTable[index] != n) {
index = ReHash(index, i, Size);
i++;
Count++;
}
if (!(*T).used[index]) {
(*T).used[index] = 1;
(*T).hashTable[index] = n;
}
return Count;
}

void Init_Table(HashTab* T, int Size) {


int i;
(*T).hashTable = malloc(sizeof(int) * Size);
(*T).used = malloc(sizeof(int) * Size);
for (i = 0; i < Size; i++) {
(*T).hashTable[i] = 0;
(*T).used[i] = 0;
}
}

int hashF(int v, int Size) {


return v % Size;
}

int ReHash(int idx, int i, int Size) {


return ((hashF(idx, Size) + i) % Size);
}

3)консоль