Загрузка данных


#include <iostream>
#include <cstdlib>
#include <ctime>

const int N = 12;          // количество элементов
const int M = 15;          // размер хеш-таблицы
const int LOW = 23000;     // нижняя граница диапазона
const int HIGH = 45000;    // верхняя граница диапазона

// Функция добавления элемента в хеш-таблицу с линейной адресацией
void sv_add(int value, int m, int* H) {
    int i = value % m;
    // линейное пробирование: ищем свободную ячейку
    while (H[i] != -1) {
        i = (i + 1) % m;
    }
    H[i] = value;
}

// Функция поиска элемента в хеш-таблице
int sv_search(int value, int m, const int* H) {
    int i = value % m;
    int start = i;
    do {
        if (H[i] == value) return i;       // элемент найден
        if (H[i] == -1) return -1;         // свободная ячейка – элемент отсутствует
        i = (i + 1) % m;
    } while (i != start);                  // обошли всю таблицу
    return -1;                             // элемент не найден
}

int main() {
    // 1. Генерация исходного массива
    std::srand(static_cast<unsigned>(std::time(nullptr)));
    int mas[N];
    std::cout << "Исходный массив (" << N << " элементов, диапазон [" << LOW << ", " << HIGH << "]):\n";
    for (int i = 0; i < N; ++i) {
        mas[i] = LOW + std::rand() % (HIGH - LOW + 1);
        std::cout << mas[i] << " ";
    }
    std::cout << std::endl;

    // 2. Создание хеш-таблицы и инициализация (-1 означает свободно)
    int H[M];
    for (int i = 0; i < M; ++i) {
        H[i] = -1;
    }

    // 3. Заполнение хеш-таблицы
    for (int i = 0; i < N; ++i) {
        sv_add(mas[i], M, H);
    }

    // 4. Вывод хеш-таблицы
    std::cout << "\nХеш-таблица (размер " << M << ", хеш-функция key % " << M << "):\n";
    for (int i = 0; i < M; ++i) {
        std::cout << "H[" << i << "] = " << H[i] << std::endl;
    }

    // 5. Поиск элементов по запросу пользователя
    std::cout << "\nПоиск элемента в хеш-таблице (для выхода введите -1):\n";
    int key;
    while (true) {
        std::cout << "Введите ключ: ";
        std::cin >> key;
        if (key == -1) break;
        int idx = sv_search(key, M, H);
        if (idx == -1) {
            std::cout << "Net elementa" << std::endl;
        } else {
            std::cout << "Элемент " << H[idx] << " найден в позиции " << idx << std::endl;
        }
    }

    return 0;
}