Загрузка данных
#include <iostream>
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 AddOchdRight(tochd *sp, int inf) {
tochd *spt = new tochd;
spt->inf = inf;
spt->left = sp;
spt->right = sp->right;
sp->right = spt;
spt->right->left = spt;
}
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;
}
int ReadOchdD(tochd *sp) {
int inf = sp->inf;
sp->left->right = sp->right;
sp->right->left = sp->left;
delete sp;
return inf;
}
void DelOchdAll(tochd **sl, tochd **sr) {
tochd *spt = (*sl)->right;
while (spt != *sr) {
ReadOchdD(spt);
spt = (*sl)->right;
}
delete *sl;
*sl = NULL;
delete *sr;
*sr = NULL;
}
// ---- Вспомогательная функция: найти указатель на минимальный и максимальный элементы ----
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;
}
}
// ---- ЗАДАЧА 10 ----
// Удалить элементы, заключенные между максимальным и минимальным значениями
void DeleteBetweenMinMax(tochd *sl, tochd *sr) {
tochd *min_ptr, *max_ptr;
FindMinMax(sl, sr, &min_ptr, &max_ptr);
// Определяем, кто из них левее (границы интервала [left_bound, right_bound])
tochd *left_bound, *right_bound;
if (min_ptr->right == max_ptr || max_ptr->right == min_ptr) {
// Если min и max соседи - удалять между ними нечего
return;
}
// Идём по указателям, чтобы выяснить порядок
tochd *spt = sl->right;
while (spt != sr) {
if (spt == min_ptr) {
left_bound = min_ptr;
right_bound = max_ptr;
break;
}
if (spt == max_ptr) {
left_bound = max_ptr;
right_bound = min_ptr;
break;
}
spt = spt->right;
}
// Удаляем элементы между left_bound и right_bound (не включая их самих)
spt = left_bound->right;
while (spt != right_bound) {
tochd *next = spt->right; // запоминаем следующий до удаления текущего
ReadOchdD(spt);
spt = next;
}
}
// ---- Пример использования ----
int main() {
tochd *sl, *sr;
NewOchd(&sl, &sr);
// Наполним список: 5, -3, 10, 2, -7, 0 (max=10, min=-7)
AddOchdLeft(sr, 0);
AddOchdLeft(sr, -7);
AddOchdLeft(sr, 2);
AddOchdLeft(sr, 10);
AddOchdLeft(sr, -3);
AddOchdLeft(sr, 5);
cout << "Исходный список: ";
PrintOchd(sl, sr); // 5 -3 10 2 -7 0
DeleteBetweenMinMax(sl, sr);
cout << "После удаления между min и max: ";
PrintOchd(sl, sr); // Ожидается: 10 -7 0 (если считать, что между max(10) и min(-7) это 2)
DelOchdAll(&sl, &sr);
return 0;
}