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


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