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


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

// ---- ЗАДАЧА 10 ----
// Удалить элементы, заключенные между максимальным и минимальным значениями
void DeleteBetweenMinMax(tochd *sl, tochd *sr) {
    tochd *min_ptr, *max_ptr;
    FindMinMax(sl, sr, &min_ptr, &max_ptr);
    
    // Если они соседи — удалять нечего
    if (min_ptr->right == max_ptr || max_ptr->right == min_ptr) {
        return;
    }
    
    // Определяем, кто левее
    tochd *left_bound = NULL, *right_bound = NULL;
    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;
        cout << "Удалён элемент: " << ReadOchdD(spt) << endl;
        spt = next;
    }
}

// ---- Пример использования ----
int main() {
    setlocale(LC_ALL, "Russian");
    srand(time(0));  // инициализация генератора случайных чисел
    
    tochd *sl, *sr;
    NewOchd(&sl, &sr);
    
    int n;
    cout << "Введите количество элементов списка: ";
    cin >> n;
    
    // Заполняем список случайными числами в диапазоне [-100, 100]
    FillRandomOchd(sr, n, -100, 100);
    
    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;
    
    DeleteBetweenMinMax(sl, sr);
    
    cout << "\nСписок после удаления элементов между min и max:" << endl;
    PrintOchd(sl, sr);
    
    DelOchdAll(&sl, &sr);
    return 0;
}