#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;
}