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



#include <iostream>
#include <random>
#include <ctime>
#include <cstdlib>
using namespace std;

struct tochd
{
    int inf;
    tochd *left;
    tochd *rigth;
};

void NewOchd(tochd **sl, tochd **sr)
{
    *sl = new tochd;
    *sr = new tochd;
    (*sl)->left = NULL;
    (*sl)->rigth = *sr;
    (*sr)->left = *sl;
    (*sr)->rigth = NULL;
}

void AddOchdLeft(tochd *sp, int inf)
{
    tochd *spt = new tochd;
    spt->inf = inf;
    spt->left = sp->left;
    spt->rigth = sp;
    spt->left->rigth = spt;
    sp->left = spt;
}

void AddOchdRigth(tochd *sp, int inf)
{
    tochd *spt = new tochd;
    spt->inf = inf;
    spt->left = sp;
    spt->rigth = sp->rigth;
    sp->rigth = spt;
    spt->rigth->left = spt;
}

int ReadOchdD(tochd *sp)
{
    int inf = sp->inf;
    sp->left->rigth = sp->rigth;
    sp->rigth->left = sp->left;
    delete sp;
    return inf;
}

void PrintList(tochd *sl, tochd *sr)
{
    tochd *p = sl->rigth;
    if (p == sr)
    {
        cout << "Список пуст";
        return;
    }
    while (p != sr)
    {
        cout << p->inf << " ";
        p = p->rigth;
    }
}

void DelOchdAll(tochd **sl, tochd **sr)
{
    tochd *spt = (*sl)->rigth;
    while (spt != *sr)
    {
        spt = (*sl)->rigth;
        ReadOchdD(spt);
    }
    delete *sl;
    delete *sr;
    *sl = NULL;
    *sr = NULL;
}

void div2Ochd(tochd *sl, tochd *sr, tochd **slL, tochd **srL, tochd **slR, tochd **srR)
{
    NewOchd(slL, srL);
    NewOchd(slR, srR);
    tochd *spt = sl->rigth;
    while (spt != sr)
    {
        AddOchdLeft(*srL, ReadOchdD(spt));
        spt = sl->rigth;
        if (spt != sr)
        {
            AddOchdLeft(*srR, ReadOchdD(spt));
            spt = sl->rigth;
        }
    }
    delete sl;
    delete sr;
}

void slipOchd(tochd **sl, tochd **sr, tochd *slL, tochd *srL, tochd *slR, tochd *srR)
{
    NewOchd(sl, sr);
    tochd *sptL = slL->rigth;
    tochd *sptR = slR->rigth;
    while ((sptL != srL) && (sptR != srR))
    {
        if (sptL->inf < sptR->inf)
        {
            AddOchdLeft(*sr, ReadOchdD(sptL));
            sptL = slL->rigth;
        }
        else
        {
            AddOchdLeft(*sr, ReadOchdD(sptR));
            sptR = slR->rigth;
        }
    }

    while (sptL != srL)
    {
        AddOchdLeft(*sr, ReadOchdD(sptL));
        sptL = slL->rigth;
    }
    delete slL;
    delete srL;

    while (sptR != srR)
    {
        AddOchdLeft(*sr, ReadOchdD(sptR));
        sptR = slR->rigth;
    }
    delete slR;
    delete srR;
}

void SotrSlipOchd(tochd **sl, tochd **sr)
{
    tochd *slL, *srL, *slR, *srR;
    if ((*sl)->rigth->rigth == *sr) return;

    div2Ochd(*sl, *sr, &slL, &srL, &slR, &srR);
    SotrSlipOchd(&slL, &srL);
    SotrSlipOchd(&slR, &srR);
    slipOchd(sl, sr, slL, srL, slR, srR);
}

int SearchPos(tochd *sl, tochd *sr, int key)
{
    int pos = 1;
    for (tochd *p = sl->rigth; p != sr; p = p->rigth, ++pos)
    {
        if (p->inf == key) return pos;
    }
    return -1;
}

tochd *FindMinNode(tochd *sl, tochd *sr)
{
    if (sl->rigth == sr) return NULL;
    tochd *mn = sl->rigth;
    for (tochd *p = mn->rigth; p != sr; p = p->rigth)
    {
        if (p->inf < mn->inf) mn = p;
    }
    return mn;
}

tochd *FindMaxNode(tochd *sl, tochd *sr)
{
    if (sl->rigth == sr) return NULL;
    tochd *mx = sl->rigth;
    for (tochd *p = mx->rigth; p != sr; p = p->rigth)
    {
        if (p->inf > mx->inf) mx = p;
    }
    return mx;
}

void DetachNode(tochd *node)
{
    node->left->rigth = node->rigth;
    node->rigth->left = node->left;
}

void InsertExistingBeforeTail(tochd *sr, tochd *node)
{
    node->left = sr->left;
    node->rigth = sr;
    sr->left->rigth = node;
    sr->left = node;
}

void DeleteNode(tochd *node)
{
    DetachNode(node);
    delete node;
}

void BuildList(tochd **sl, tochd **sr, int a[], int n)
{
    NewOchd(sl, sr);
    for (int i = 0; i < n; i++)
    {
        AddOchdLeft(*sr, a[i]);
    }
}

void PrintHeader(const char *text)
{
    cout << text << endl;
}

void Task4(tochd **sl, tochd **sr)
{
    tochd *sl2, *sr2;
    NewOchd(&sl2, &sr2);

    tochd *mx = FindMaxNode(*sl, *sr);
    if (mx != NULL)
    {
        tochd *p = mx->rigth;
        while (p != *sr)
        {
            tochd *next = p->rigth;
            DetachNode(p);
            InsertExistingBeforeTail(sr2, p);
            p = next;
        }
    }

    PrintHeader("Первый список после переноса:");
    PrintList(*sl, *sr);
    cout << endl;

    PrintHeader("Второй список:");
    PrintList(sl2, sr2);
    cout << endl;

    DelOchdAll(sl, sr);
    DelOchdAll(&sl2, &sr2);
}

void Task9(tochd **sl, tochd **sr)
{
    tochd *mn = FindMinNode(*sl, *sr);
    if (mn != NULL)
    {
        if (mn->left == *sl || mn->rigth == *sr)
        {
            DeleteNode(mn);
        }
        else
        {
            DeleteNode(mn->left);
            DeleteNode(mn->rigth);
        }
    }

    PrintHeader("Список после удаления:");
    PrintList(*sl, *sr);
    cout << endl;

    DelOchdAll(sl, sr);
}

void Task11(tochd **sl, tochd **sr)
{
    int values[100];
    int counts[100];
    int n = 0;

    for (tochd *p = (*sl)->rigth; p != *sr; p = p->rigth)
    {
        values[n] = p->inf;
        counts[n] = 0;
        n++;
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (values[i] == values[j]) counts[i]++;
        }
    }

    tochd *p = (*sl)->rigth;
    while (p != *sr)
    {
        tochd *next = p->rigth;
        bool remove = false;
        for (int i = 0; i < n; i++)
        {
            if (p->inf == values[i] && counts[i] > 1)
            {
                remove = true;
                break;
            }
        }
        if (remove) DeleteNode(p);
        p = next;
    }

    PrintHeader("Список после удаления повторяющихся значений:");
    PrintList(*sl, *sr);
    cout << endl;

    DelOchdAll(sl, sr);
}

int main()
{
    srand(time(0));

    const int N = 10;
    int a[N];
    for (int i = 0; i < N; i++)
    {
        a[i] = rand() % 101 - 50;
    }

    tochd *sl, *sr;
    BuildList(&sl, &sr, a, N);

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

    SotrSlipOchd(&sl, &sr);

    PrintHeader("Отсортированный список:");
    PrintList(sl, sr);
    cout << endl;

    const int variantKey = 4;
    int pos = SearchPos(sl, sr, variantKey);
    if (pos != -1)
    {
        cout << "Элемент " << variantKey << " найден, порядковый номер: " << pos << endl;
    }
    else
    {
        cout << "Элемент " << variantKey << " не найден" << endl;
    }

    Task4(&sl, &sr);

    return 0;
}