Phoenix_x

Untitled

Mar 21st, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.98 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include<iostream>
  3.  
  4.  
  5. using namespace std;
  6. int br = 1;
  7.  
  8. void push_l(int n);
  9. void push_r(int n);
  10. int pop_l(int &n);
  11. int pop_r(int &n);
  12. void list();
  13. void tarseneNaChislo(int chisloZaTarsene);
  14.  
  15.  
  16. struct elem                             //структура на дек
  17. {
  18.     int key;                         //съдържа стойността на елемента
  19.     elem *next;          //сочи към следващия елемент                      
  20. } *_left = NULL, *_right = NULL;        //left сочи към краиния ляв елемент,а right сочи към крайния десен
  21.  
  22. void push_l(int n)              //добавяне на елемент със стойност n
  23. {
  24.     elem *p;                //създаване на указател p от тип elem
  25.     p = _left;                      //p приема стойността на крайния ляв елемент
  26.     _left = new elem;       //създава нов елемент сочен от left
  27.     _left->key = n; //установяване на  n заа стойност на крайния ляв елемент
  28.     _left->next = p;                //следващия елемент left приема стойността на p
  29.     if (right == NULL)           //ако няма краен десен елемент, то left  става такъв
  30.     {
  31.         _right = _left;
  32.     }
  33. }
  34. void push_r(int n)              //добавяне отдясно на елемент със стойност  n
  35. {
  36.     elem *p;                //създаване на указател  p от тип elem
  37.     p = _right;             //p приема стойността на краиния десен елемент
  38.     _right = new elem;      //създаване на нов елемент сочен от right
  39.     _right->key = n;                //установяване на n за стойнот на крайния десен елемент
  40.     _right->next = NULL;    //следващия елемент right приема NULL
  41.     if (_left == NULL)              //ако няма краен ляв елемент
  42.     {
  43.         _left = _right;         //крайният ляв приема стйността на крайния
  44.     }
  45.     else                            //десен, в противен случей                      
  46.         p->next = _right;       // следващият елемент райт приема стойността на крайния десен елемент
  47. }
  48. int pop_l(int &n)                       //извличане на елемент отляво
  49. {
  50.     elem *p;                        //създаване на указател p от тип elem
  51.     if (_left)                              //проверка за наличие на краен ляв елемент
  52.     {
  53.         n = _left->key;             //n приема стойността на крайния ляв елемент
  54.         p = _left;                      //p  сочи крайния елемент
  55.         _left = _left->next;    //left сочи следващият негов елемент
  56.         if (left == NULL)               //ако няма краен ляв елемент
  57.             _right = NULL;          //указателят right се занулява
  58.         delete p;               //изтриване на указателя  p
  59.         return 1;
  60.     }
  61.     else
  62.         return 0;
  63. }
  64. int pop_r(int &n)                       //извличане на елемент отдясно
  65. {
  66.     elem *p;                        //създаване на указател p от тип elem
  67.     if (right)                      //проверка за наличие на краен десен елемент
  68.     {
  69.         n = _right->key;                 //n приема стойността на крайния десен елемент
  70.         if (_left == _right)            //ако крайния десен елемент=крайния ляв
  71.         {
  72.             delete _right;          //изтриване на крайния десен
  73.             _left = _right = NULL;  //нулиране на указателите
  74.         }
  75.         else
  76.         {
  77.             p = _left;                      //p приема стойността на крайния ляв елемент
  78.             while (p->next != _right)       //докато следващия p елемент
  79.                                             //е различен от крайния десен
  80.                 p = p->next;                    //p преминава на следващия елемент
  81.             n = _right->key;                        //n приема стойността на крайния десен
  82.             p->next = NULL;         //указателят за следващият на  p се нулира
  83.             delete _right;                  //изтриване на крайния десен елемент
  84.             _right = p;                     //крайният десен приема стойността на p
  85.         }
  86.         return 1;
  87.     }
  88.     else
  89.         return 0;
  90. }
  91.  
  92.  
  93.  
  94. void list()                     //извеждане на елементите на дека
  95. {
  96.     int element;
  97.     cout << "\n DEK: \t";
  98.     while (pop_l(element)) {
  99.         cout << element << "\t";
  100.     }
  101. }
  102.  
  103. void tarseneNaChislo(int chisloZaTarsene)
  104. {
  105.     int number;
  106.     bool dobavqneNaChisloto = false;
  107.  
  108.     for (int i = 0; i < br; i++)  //цикъл за обхождане на дека
  109.     {
  110.         pop_l(number);       //извличане на крайния ляв елемент
  111.         if (number == chisloZaTarsene)             //проверка за достигнат n-ти  елемент
  112.         {
  113.             dobavqneNaChisloto = true;
  114.         }
  115.  
  116.         push_r(number); //добавяне на извлечения елемент от дясно
  117.     }
  118.  
  119.     if (dobavqneNaChisloto)
  120.     {
  121.         push_l(chisloZaTarsene); //ако елемента е намерен, да се добави отляво
  122.     }
  123. }
  124.  
  125. void main()
  126. {
  127.     cout << "Broj elementi: ";
  128.     cin >> br;
  129.  
  130.     int number;
  131.  
  132.     for (int i = 0; i < br; i++)
  133.     {
  134.         cin >> number;
  135.         push_r(number);
  136.     }
  137.  
  138.     int chisloZaProverka;
  139.     cout << "Chislo za tarsene: ";
  140.     cin >> chisloZaProverka;
  141.  
  142.     tarseneNaChislo(chisloZaProverka);
  143.     list();
  144. }
Advertisement
Add Comment
Please, Sign In to add comment