Advertisement
cacodemon665

Лаба 15 Вариант 1

Apr 8th, 2019
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct DoubleEndedQueue
  6. {
  7.     int info;
  8.     DoubleEndedQueue *left, *right;
  9. };
  10.  
  11. void NewQueue(DoubleEndedQueue** sl, DoubleEndedQueue** sr)
  12. {
  13.     *sl = new DoubleEndedQueue;
  14.     *sr = new DoubleEndedQueue;
  15.     (*sl)->left = NULL;
  16.     (*sl)->right = *sr;
  17.     (*sr)->left = *sl;
  18.     (*sr)->right = NULL;
  19. }
  20.  
  21. void DeleteQueue(DoubleEndedQueue** sl, DoubleEndedQueue** sr)
  22. {
  23.     DoubleEndedQueue* t;
  24.     while ((*sl)->right != (*sr))
  25.     {
  26.         t = (*sl)->right->right;
  27.         delete (*sl)->right;
  28.         (*sl)->right = t;
  29.     }
  30.     delete* sl;  *sl = NULL;
  31.     delete* sr;  *sr = NULL;
  32. }
  33.  
  34. void addLeft(DoubleEndedQueue* sp, int inf)
  35. {
  36.     DoubleEndedQueue* spt = new DoubleEndedQueue;
  37.     spt->info = inf;
  38.     spt->left = sp->left;
  39.     spt->right = sp;
  40.     spt->left->right = spt;
  41.     sp->left = spt;
  42. }
  43.  
  44. void addRight(DoubleEndedQueue* sp, int inf)
  45. {
  46.     DoubleEndedQueue* spt = new DoubleEndedQueue;
  47.     spt->info = inf;
  48.     spt->left = sp;
  49.     spt->right = sp->right;
  50.     sp->right = spt;
  51.     spt->right->left = spt;
  52. }
  53.  
  54. void PrintQueue(DoubleEndedQueue* sl, DoubleEndedQueue* sr)
  55. {
  56.     DoubleEndedQueue* p = sl;
  57.     while ((p = p->right) != sr)
  58.     {
  59.         cout << p->info << " ";
  60.     }
  61.     cout << endl;
  62. }
  63.  
  64. int read_del(DoubleEndedQueue* sp)
  65. {
  66.     int inf = sp->info;
  67.     sp->left->right = sp->right;
  68.     sp->right->left = sp->left;
  69.     delete sp;
  70.     return inf;
  71. }
  72.  
  73. void div2Ochd(DoubleEndedQueue* sl, DoubleEndedQueue* sr, DoubleEndedQueue** slL, DoubleEndedQueue** srL, DoubleEndedQueue** slR, DoubleEndedQueue** srR)
  74. {
  75.     NewQueue(slL, srL);
  76.     NewQueue(slR, srR);
  77.     DoubleEndedQueue* spt = sl->right;
  78.     while (spt != sr)
  79.     {
  80.         addLeft(*srL, read_del(spt));
  81.         spt = sl->right;
  82.         if (spt != sr)
  83.         {
  84.             addLeft(*srR, read_del(spt));
  85.             spt = sl->right;
  86.         }
  87.     }
  88.     delete sl;
  89.     delete sr;
  90. }
  91.  
  92.  
  93. void slip(DoubleEndedQueue** sl, DoubleEndedQueue** sr, DoubleEndedQueue* slL, DoubleEndedQueue* srL, DoubleEndedQueue* slR, DoubleEndedQueue* srR)
  94. {
  95.     NewQueue(sl, sr);
  96.     DoubleEndedQueue* sptL = slL->right;
  97.     DoubleEndedQueue* sptR = slR->right;
  98.     while ((sptL != srL) && (sptR != srR))
  99.     {
  100.         if (sptL->info < sptR->info)
  101.         {
  102.             addLeft(*sr, read_del(sptL));
  103.             sptL = slL->right;
  104.         }
  105.         else
  106.         {
  107.             addLeft(*sr, read_del(sptR));
  108.             sptR = slR->right;
  109.         }
  110.     }
  111.     while (sptL != srL)
  112.     {
  113.         addLeft(*sr, read_del(sptL));
  114.         sptL = slL->right;
  115.     }
  116.     delete slL; delete srL;
  117.  
  118.     while (sptR != srR)
  119.     {
  120.         addLeft(*sr, read_del(sptR));
  121.         sptR = slR->right;
  122.     }
  123.     delete slR; delete srR;
  124. }
  125.  
  126. void sort(DoubleEndedQueue** sl, DoubleEndedQueue** sr)
  127. {
  128.     DoubleEndedQueue* slL, * srL, * slR, * srR;
  129.     if ((*sl)->right->right == *sr) return;
  130.     div2Ochd(*sl, *sr, &slL, &srL, &slR, &srR);
  131.     sort(&slL, &srL);
  132.     sort(&slR, &srR);
  133.     slip(sl, sr, slL, srL, slR, srR);
  134. }
  135.  
  136. void search(DoubleEndedQueue * sl, DoubleEndedQueue * sr, int x)
  137. {
  138.     DoubleEndedQueue* p = sl;
  139.     int n = 0;
  140.     while ((p = p->right) != sr)
  141.     {
  142.         n++;
  143.         if (p->info == x) break;
  144.     }
  145.  
  146.     if (p->info == x)
  147.         cout << "Found. pos=" << n << endl;
  148.     else
  149.         cout << "Not found!" << endl;
  150.  
  151. }
  152.  
  153.  
  154.  
  155. int main()
  156. {
  157.     int n, k, nvar = 1;
  158.  
  159.     cout << "Enter n: ";
  160.     cin >> n;
  161.  
  162.     DoubleEndedQueue* sl, * sr;
  163.     NewQueue(&sl, &sr);
  164.  
  165.     for (int i = 0; i < n; i++)
  166.     {
  167.         cin >> k;
  168.         addRight(sl, k);
  169.     }
  170.  
  171.     cout << "Queue:" << endl;
  172.     PrintQueue(sl, sr);
  173.  
  174.     cout << "Search:" << nvar << endl;
  175.     search(sl, sr, nvar);
  176.  
  177.     cout << "Move min to first: " << endl;
  178.     DoubleEndedQueue* p = sl->right;
  179.     DoubleEndedQueue* min = p;
  180.     while ((p = p->right) != sr)
  181.     {
  182.         if (p->info < min->info) min = p;
  183.     }
  184.     if (min != sl->right)
  185.     {
  186.         p = sl->right;
  187.         min->left->right = min->right;
  188.         min->right->left = min->left;
  189.         sl->right = min;
  190.         min->right = p;
  191.         p->left = min;
  192.         min->left = sl;
  193.     }
  194.  
  195.     PrintQueue(sl, sr);
  196.  
  197.     cout << "sorted:" << endl;
  198.     sort(&sl, &sr);
  199.     PrintQueue(sl, sr);
  200.  
  201.     DeleteQueue(&sl, &sr);
  202.     return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement