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


#include <iostream>
using namespace std;

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

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

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 printOchd(tochd *sl, tochd *sr) {
    tochd *p = sl->right;
    while (p != sr) {
        cout << p->inf << " ";
        p = p->right;
    }
    cout << endl;
}

void addToEnd(tochd *sr, int val) {
    AddOchdLeft(sr, val);
}

// Поиск указателя на минимальный элемент
tochd* findMin(tochd *sl, tochd *sr) {
    tochd *p = sl->right;
    if (p == sr) return nullptr;
    tochd *minPtr = p;
    int minVal = p->inf;
    p = p->right;
    while (p != sr) {
        if (p->inf < minVal) {
            minVal = p->inf;
            minPtr = p;
        }
        p = p->right;
    }
    return minPtr;
}

int main() {
    setlocale(LC_ALL, "Russian");
    tochd *sl, *sr;
    NewOchd(&sl, &sr);

    int n;
    cout << "Введите количество элементов: ";
    cin >> n;
    cout << "Введите элементы: ";
    for (int i = 0; i < n; ++i) {
        int val;
        cin >> val;
        addToEnd(sr, val);
    }

    cout << "Исходный список: ";
    printOchd(sl, sr);

    tochd *minPtr = findMin(sl, sr);
    if (!minPtr) {
        cout << "Список пуст.\n";
        DelOchdAll(&sl, &sr);
        return 0;
    }
    cout << "Минимальный элемент: " << minPtr->inf << endl;

    bool hasLeft = (minPtr->left != sl);   // есть ли элемент слева
    bool hasRight = (minPtr->right != sr); // есть ли элемент справа

    if (!hasLeft || !hasRight) {
        // Удаляем сам минимальный
        cout << "Один из соседей отсутствует – удаляю минимальный элемент.\n";
        ReadOchdD(minPtr);
    } else {
        // Удаляем левого и правого соседей
        cout << "Удаляю левый (" << minPtr->left->inf
             << ") и правый (" << minPtr->right->inf << ") элементы.\n";
        tochd *leftNeighbor = minPtr->left;
        tochd *rightNeighbor = minPtr->right;
        ReadOchdD(leftNeighbor);
        ReadOchdD(rightNeighbor);
    }

    cout << "Результат: ";
    printOchd(sl, sr);

    DelOchdAll(&sl, &sr);
    return 0;
}