Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <time.h>
- struct tochd
- {
- int inf;
- tochd *l;
- tochd *r;
- };
- using namespace std;
- void NewOchd(tochd **sl, tochd **sr) {
- *sl = new tochd;
- *sr = new tochd;
- (*sl)->l = NULL;
- (*sl)->r = *sr;
- (*sr)->l = *sl;
- (*sr)->r = NULL;
- }
- void AddOchdR(tochd *sp, int inf) {
- tochd *spt = new tochd;
- spt->inf = inf;
- spt->l = sp;
- spt->r = sp->r;
- sp->r->l = spt;
- sp->r = spt;
- }
- void AddOchdL(tochd *sp, int inf) {
- tochd *spt = new tochd;
- spt->inf = inf;
- spt->l = sp->l;
- spt->r = sp;
- sp->l->r = spt;
- sp->l = spt;
- }
- int ReadOchdD(tochd *sp) {
- int inf = sp->inf;
- sp->l->r = sp->r;
- sp->r->l = sp->l;
- delete sp;
- return inf;
- }
- void DelOchdAll(tochd **sl, tochd **sr)
- {
- tochd *spt = (*sl)->r;
- while (spt != *sr)
- {
- cout << ReadOchdD(spt) << " ";
- spt = (*sl)->r;
- }
- cout << endl; *sl = NULL;
- delete *sl; *sr = NULL;
- delete *sr;
- return;
- }
- void div2Ochd(tochd *sl, tochd *sr, tochd **slL,
- tochd **srL, tochd **slR, tochd **srR) {
- NewOchd(slL, srL);
- NewOchd(slR, srR);
- tochd *spt = sl->r;
- while (spt != sr)
- {
- AddOchdL(*srL, ReadOchdD(spt));
- spt = sl->r;
- if (spt != sr)
- {
- AddOchdL(*srR, ReadOchdD(spt));
- spt = sl->r;
- }
- }
- }
- void slipOchd(tochd **sl, tochd **sr, tochd *slL, tochd *srL, tochd
- *slR, tochd *srR)
- {
- NewOchd(sl, sr);
- tochd *sptL = slL->r;
- tochd *sptR = slR->r;
- while ((sptL != srL) && (sptR != srR))
- {
- if (sptL->inf < sptR->inf)
- {
- AddOchdL(*sr, ReadOchdD(sptL));
- sptL = slL->r;
- }
- else
- {
- AddOchdL(*sr, ReadOchdD(sptR));
- sptR = slR->r;
- }
- }
- while (sptL != srL)
- {
- AddOchdL(*sr, ReadOchdD(sptL));
- sptL = slL->r;
- }
- delete slL; delete srL;
- while (sptR != srR)
- {
- AddOchdL(*sr, ReadOchdD(sptR));
- sptR = slR->r;
- }
- delete slR; delete srR;
- }
- void SotrSlipOchd(tochd **sl, tochd **sr) {
- tochd *slL, *srL, *slR, *srR;
- if ((*sl)->r == *sr || (*sl)->r->r == *sr) return;
- div2Ochd(*sl, *sr, &slL, &srL, &slR, &srR);
- SotrSlipOchd(&slL, &srL);
- SotrSlipOchd(&slR, &srR);
- slipOchd(sl, sr, slL, srL, slR, srR);
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- srand(time(NULL));
- int n;
- cout << "Введите количество элементов ";
- cin >> n;
- tochd *sl, *sr;
- NewOchd(&sl, &sr);
- for (int i = 0; i < n; i++) {//заполнение списка
- int temp = rand() % 101 - 50;
- cout << temp << " ";
- AddOchdL(sr, temp);
- }
- cout << endl;
- tochd*min = new tochd;//указатель на мин элемент
- min = sl->r;
- tochd*spt = new tochd;
- spt = sl->r;
- while (spt != sr) {//поиск мин элемента
- if (min->inf > spt->inf)min = spt;
- spt = spt->r;
- }
- min->r->l = min->l;//эта и
- min->l->r = min->r;//эта удаление элемента со своего места
- sl->r->l = min;//эта
- min->r = sl->r;//эта
- min->l = sl;//эта
- sl->r = min;//эта вставка в начало
- spt = sl->r;
- while (spt != sr) {//вывод стека
- cout << spt->inf << " ";
- spt = spt->r;
- }
- cout << endl;
- SotrSlipOchd(&sl, &sr);//сортировка слиянием
- spt = sl->r;
- int x = 1;//твой вариант
- int pos = 1;//позиция элемента
- while (spt != sr && spt->inf != x) {//пока не найдем твой вариант, либо не выйдем за границы
- pos++;
- spt = spt->r;//присваиваем след элемент
- }
- if (spt != sr) { //если после выхода мы находимся внутри списка, то мы нашли нужный элемент,
- cout << "Элемент с моим вариантом находится на " << pos << " позиции" << endl;
- }
- else {
- cout << "Нет моего варианта" << endl;
- }
- DelOchdAll(&sl, &sr);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement