Загрузка данных
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <string>
using namespace std;
// Структура для B7
struct Reise {
string destination; // Пункт назначения
int flightNumber; // Номер рейса (КЛЮЧ)
string departTime; // Время отправления
};
// Хеш-функция 1: i = Key % M
int hashFunc1(int key, int M) {
return key % M;
}
// Хеш-функция 2: c = 1 + (Key % (M-2))
int hashFunc2(int key, int M) {
return 1 + (key % (M - 2));
}
// Вставка с двойным хешированием
void sv_add(Reise reise, int m, Reise H[], int status[]) {
int key = reise.flightNumber;
int i = hashFunc1(key, m);
int c = hashFunc2(key, m);
int attempts = 0;
// Поиск свободной ячейки
while (status[i] == 1 && attempts < m) { // 1 = занято
i = i - c;
if (i < 0) i = i + m;
attempts++;
}
if (status[i] != 1) {
H[i] = reise;
status[i] = 1; // Помечаем как занято
}
}
// Поиск с двойным хешированием
int sv_search(int key, int m, Reise H[], int status[]) {
int i = hashFunc1(key, m);
int c = hashFunc2(key, m);
int start = i;
int attempts = 0;
while (status[i] != 0 && attempts < m) { // 0 = свободно
if (status[i] == 1 && H[i].flightNumber == key) {
return i; // Нашли
}
i = i - c;
if (i < 0) i = i + m;
attempts++;
if (i == start) break;
}
return -1; // Не нашли
}
// Генерация случайных данных
string randomDestination() {
string destinations[] = {"Москва", "СПб", "Новосибирск", "Екатеринбург", "Казань",
"Сочи", "Владивосток", "Красноярск", "Ростов", "Уфа"};
return destinations[rand() % 10];
}
string randomTime() {
int hour = rand() % 24;
int minute = rand() % 60;
return to_string(hour) + ":" + (minute < 10 ? "0" : "") + to_string(minute);
}
int randomFlightNumber() {
return 100 + rand() % 900; // 100-999
}
// Вывод хеш-таблицы
void printHashTable(Reise H[], int status[], int m) {
cout << "\n=== Хеш-таблица (двойное хеширование) ===" << endl;
for (int i = 0; i < m; i++) {
if (status[i] == 1) {
cout << "H[" << setw(2) << i << "] -> Рейс " << H[i].flightNumber
<< " | " << H[i].destination << " | " << H[i].departTime << endl;
} else {
cout << "H[" << setw(2) << i << "] -> СВОБОДНО" << endl;
}
}
}
int main() {
srand(time(NULL));
// Параметры варианта B7
const int n = 8; // Количество элементов
const int M = 10; // Размер хеш-таблицы
// Генерация исходного массива рейсов
Reise reisen[n];
cout << "=== ВАРИАНТ B7: Двойное хеширование (ключ - номер рейса) ===" << endl;
cout << "Сгенерированный массив рейсов (" << n << " элементов):" << endl;
cout << "----------------------------------------------------------------" << endl;
for (int i = 0; i < n; i++) {
reisen[i].flightNumber = randomFlightNumber();
reisen[i].destination = randomDestination();
reisen[i].departTime = randomTime();
cout << "[" << i << "] Рейс " << reisen[i].flightNumber
<< " | " << reisen[i].destination
<< " | " << reisen[i].departTime
<< " (hash1 = " << (reisen[i].flightNumber % M) << ")" << endl;
}
cout << "----------------------------------------------------------------" << endl;
// Создание хеш-таблицы
Reise H[M];
int status[M]; // 0 - свободно, 1 - занято
for (int i = 0; i < M; i++) {
status[i] = 0;
}
// Заполнение хеш-таблицы
for (int i = 0; i < n; i++) {
sv_add(reisen[i], M, H, status);
}
// Вывод хеш-таблицы
printHashTable(H, status, M);
// === ПОИСК ПО КЛЮЧУ (номер рейса) ===
cout << "\n=== ПОИСК РЕЙСА ===" << endl;
int searchFlight;
cout << "Введите номер рейса для поиска: ";
cin >> searchFlight;
int position = sv_search(searchFlight, M, H, status);
if (position != -1) {
cout << "\n✅ Рейс " << searchFlight << " НАЙДЕН!" << endl;
cout << "Позиция в хеш-таблице: H[" << position << "]" << endl;
cout << "\n--- ВСЕ ПОЛЯ СТРУКТУРЫ ---" << endl;
cout << "Номер рейса: " << H[position].flightNumber << endl;
cout << "Пункт назначения: " << H[position].destination << endl;
cout << "Время отправления: " << H[position].departTime << endl;
} else {
cout << "\n❌ Рейс " << searchFlight << " НЕ НАЙДЕН в хеш-таблице!" << endl;
}
return 0;
}