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