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


#include <iostream>
#include <cstdlib>   // для rand() и srand()
#include <ctime>     // для time()
using namespace std;

struct tochd {
    int inf;
    tochd *left;
    tochd *right;
};

// ---- Вывод списка на экран ----
void PrintOchd(tochd *sl, tochd *sr) {
    tochd *spt = sl->right;
    while (spt != sr) {
        cout << spt->inf << " ";
        spt = spt->right;
    }
    cout << endl;
}

// ---- Функции из лабораторной ----
void NewOchd(tochd **sl, tochd **sr) {
    *sl = new tochd;
    *sr = new tochd;
    (*sl)->left = NULL;
    (*sl)->right = *sr;
    (*sr)->left = *sl;
    (*sr)->right = NULL;
}

void AddOchdLeft(tochd *sp, int inf) {
    tochd *spt = new tochd;
    spt->inf = inf;
    spt->left = sp->left;
    spt->right = sp;
    spt->left->right = spt;
    sp->left = spt;
}

void DelOchdAll(tochd **sl, tochd **sr) {
    tochd *spt = (*sl)->right;
    while (spt != *sr) {
        tochd *next = spt->right;
        delete spt;
        spt = next;
    }
    delete *sl;
    *sl = NULL;
    delete *sr;
    *sr = NULL;
}

// ---- Заполнение списка случайными числами ----
void FillRandomOchd(tochd *sr, int n, int min_val = -50, int max_val = 50) {
    for (int i = 0; i < n; i++) {
        int random_num = min_val + rand() % (max_val - min_val + 1);
        AddOchdLeft(sr, random_num);
    }
}

// ---- Нахождение указателей на минимальный и максимальный элементы ----
void FindMinMax(tochd *sl, tochd *sr, tochd **min_ptr, tochd **max_ptr) {
    *min_ptr = sl->right;
    *max_ptr = sl->right;
    tochd *spt = sl->right;
    
    while (spt != sr) {
        if (spt->inf < (*min_ptr)->inf)
            *min_ptr = spt;
        if (spt->inf > (*max_ptr)->inf)
            *max_ptr = spt;
        spt = spt->right;
    }
}

// ---- ЗАДАЧА 12 ----
// Поменять местами элементы с максимальным и минимальным значениями,
// при этом элементы не должны перемещаться в памяти (меняем только inf)
void SwapMinMax(tochd *sl, tochd *sr) {
    tochd *min_ptr, *max_ptr;
    FindMinMax(sl, sr, &min_ptr, &max_ptr);
    
    // Если min и max — один и тот же элемент (все элементы одинаковые)
    if (min_ptr == max_ptr) {
        cout << "Все элементы одинаковые, нечего менять." << endl;
        return;
    }
    
    // Меняем только значения inf, не перемещая сами элементы в памяти
    int temp = min_ptr->inf;
    min_ptr->inf = max_ptr->inf;
    max_ptr->inf = temp;
    
    cout << "Поменяны местами: min = " << max_ptr->inf 
         << " и max = " << min_ptr->inf << endl;
}

// ---- Пример использования ----
int main() {
    setlocale(LC_ALL, "Russian");
    srand(time(0));
    
    tochd *sl, *sr;
    NewOchd(&sl, &sr);
    
    int n;
    cout << "Введите количество элементов списка: ";
    cin >> n;
    
    // Заполняем случайными числами в диапазоне [-50, 50]
    FillRandomOchd(sr, n, -50, 50);
    
    cout << "\nИсходный список:" << endl;
    PrintOchd(sl, sr);
    
    tochd *min_ptr, *max_ptr;
    FindMinMax(sl, sr, &min_ptr, &max_ptr);
    cout << "Минимальный элемент: " << min_ptr->inf << endl;
    cout << "Максимальный элемент: " << max_ptr->inf << endl;
    
    SwapMinMax(sl, sr);
    
    cout << "\nСписок после обмена min и max:" << endl;
    PrintOchd(sl, sr);
    
    cout << "\nПроверка адресов (элементы не перемещались):" << endl;
    cout << "Адрес минимального (теперь max): " << min_ptr << endl;
    cout << "Адрес максимального (теперь min): " << max_ptr << endl;
    
    DelOchdAll(&sl, &sr);
    return 0;
}