Advertisement
AlexandrTalchuk

Untitled

Apr 14th, 2020
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.19 KB | None | 0 0
  1. #include <iostream>
  2. #include "windows.h"
  3. #include <fstream>
  4. using namespace std;
  5.  
  6. struct list
  7. {
  8.     int info;
  9.     list* next, *prev;
  10. };
  11.  
  12.  
  13. void Create(list*& head, list*& end);
  14. void Add(list*& head, list*& end);
  15. void Add_end(list*& end, int inf);
  16. void Add_head(list*& head, int inf);
  17. void Del_el(list*& head);
  18. void Delete(list*& head);
  19. void View(list*& head, list*& end);
  20. void View_head(list*& head);
  21. void View_end(list*& end);
  22. void Solution(list** head, list** end);
  23.  
  24.  
  25. int main()
  26. {
  27.     setlocale(LC_ALL, "rus");
  28.     list* head = new list;
  29.     head = NULL;
  30.     list* end = new list;
  31.     end = NULL;
  32.  
  33.     int choice,info=0;
  34.     while (true)
  35.     {
  36.         cout << " 1. Создание\n 2. Добавление\n 3. Удаление\n 4. Просмотр \n 5. Сортировка\n 6. Выход" << endl;
  37.         cin >> choice;
  38.         switch (choice)
  39.         {
  40.         case 1:
  41.             Create(head, end);
  42.             Sleep(1000);
  43.             system("cls");
  44.             break;
  45.         case 2:
  46.             Add(head, end);
  47.             Sleep(1000);
  48.             system("cls");
  49.             break;
  50.         case 3:
  51.             Del_el(head);
  52.             Sleep(1000);
  53.             system("cls");
  54.             break;
  55.         case 4:
  56.             View(head,end);
  57.             Sleep(1000);
  58.             system("cls");
  59.             break;
  60.         case 5:
  61.  
  62.             Solution(&head,&end);          
  63.             Sleep(3000);
  64.             system("cls");
  65.             break;
  66.         case 6:
  67.             Delete(head);
  68.             Delete(end);
  69.             exit(0);
  70.             break;
  71.         default:
  72.             cout << "Повторите еще раз" << endl;
  73.             break;
  74.         }
  75.     }
  76. }
  77.  
  78. void Create(list*& head, list*& end)
  79. {
  80.     if (head == NULL)
  81.     {
  82.         int kolvo, i, info;
  83.         cout << "Введите количество элементов" << endl;
  84.         cin >> kolvo;
  85.         if (cin.fail() || kolvo < 0)
  86.         {
  87.             cout << "Условия ввода не соблюдены" << endl;
  88.             return;
  89.         }
  90.         cout << "1-ый " ;
  91.         cin >> info;
  92.         list* t = new list;
  93.         t->info = info;
  94.         t->next = head;
  95.         t->prev = end;
  96.         head = end = t;
  97.         for (i = 1; i < kolvo; i++)
  98.         {
  99.             cout << i + 1 << "-ый ";
  100.             cin >> info;
  101.             Add_end(end, info);
  102.         }
  103.     }
  104.     else
  105.         cout << "Список уже создан" << endl;
  106. }
  107.  
  108. void Add(list*& head, list*& end)
  109. {
  110.     cout << " 1.Добавить элемент в начало списка\n 2.Добавить элемент в конец списка" << endl;
  111.     int u,element;
  112.     cin >> u;
  113.     switch (u)
  114.     {
  115.     case 1:
  116.         cout << "Введите добавляемый элемент" << endl;
  117.         cin >> element;
  118.         Add_head(head, element);
  119.         break;
  120.     case 2:
  121.         cout << "Введите добавляемый элемент" << endl;
  122.         cin >> element;
  123.         Add_end(end, element);
  124.         break;
  125.     default:
  126.         cout << "Данный символ ввести невозможно" << endl;
  127.         break;
  128.     }
  129. }
  130.  
  131. void Add_end(list*& end, int inf)
  132. {
  133.     list* t = new list;
  134.     t->info = inf;
  135.     t->next = NULL;
  136.     t->prev = end;
  137.     end->next = t;
  138.     end = t;
  139. }
  140.    
  141. void Add_head(list*&head,int inf)
  142. {
  143.     list* t = new list;
  144.     t->prev = NULL;
  145.     t->info = inf;
  146.     t->next = head;
  147.     head->prev = t;
  148.     head = t;
  149. }
  150.  
  151. void Del_el(list*& head)
  152. {
  153.     if (head != NULL)
  154.     {
  155.         list* t = nullptr;
  156.         t = head;
  157.         head = head->next;
  158.         delete t;
  159.  
  160.     }
  161. }
  162.  
  163. void Delete(list*& head)
  164. {
  165.     list* t = nullptr;
  166.     while (head!= NULL)
  167.     {
  168.         t =head;
  169.         head = head->next;
  170.         delete t;
  171.  
  172.     }
  173. }
  174.  
  175. void View(list*& head, list*& end)
  176. {
  177.  
  178.     if (head == NULL)
  179.     {
  180.         cout << "Список пуст!" << endl;
  181.         return;
  182.     }
  183.     cout << "\n 1. Просмотр списка сначала\n 2. Просмотр списка с конца" << endl;
  184.     int r;
  185.     cin >> r;
  186.     switch (r)
  187.     {
  188.      case 1:
  189.          View_head(head);
  190.         break;
  191.      case 2:
  192.          View_end(end);
  193.         break;
  194.      default:
  195.         cout << "Значение введено неправильно" << endl;
  196.         return;
  197.     }
  198. }
  199.  
  200. void View_head(list*& head)
  201. {
  202.     list* t =head;
  203.     while (t != NULL)
  204.     {
  205.         cout << "Элемент равен " << t->info << endl;
  206.         t = t->next;
  207.     }
  208. }
  209.  
  210. void View_end(list*& end)
  211. {
  212.     list* t =end;
  213.     while (t != NULL)
  214.     {
  215.         cout << "Элемент равен " << t->info << endl;
  216.         t = t->prev;
  217.     }
  218. }
  219.  
  220. //void Solution(list*& head, list*& end, list*& Even_head, list*& Even_end, list*& Odd_head, list*& Odd_end)
  221. //{
  222. //  list* current = head;
  223. //  list* t1 = new list;
  224. //  list* t2 = new list;
  225. //  list* t3 = new list;
  226. //  t1->prev = NULL;
  227. //  t1->next = NULL;
  228. //  t2->prev = NULL;
  229. //  t2->next = NULL;
  230. //  t3->prev = NULL;
  231. //  t3->next = NULL;
  232. //  Even_head = Even_end = t1;
  233. //  Odd_head = Odd_end = t2;
  234. //  head = end = t3;
  235. //
  236. //  while (current != nullptr)
  237. //  {
  238. //      if (current->info % 2 == 0)
  239. //      {
  240. //          list* tmp = current;
  241. //          tmp->info = current->info;
  242. //          current = current->next;
  243. //          tmp->next = NULL;
  244. //          tmp->prev = Even_end;
  245. //          Even_end->next = tmp;
  246. //          Even_end = tmp;
  247. //
  248. //      }
  249. //      else
  250. //      {
  251. //          list* tmp = current;
  252. //          tmp->info = current->info;
  253. //          current = current->next;
  254. //          tmp->next = NULL;
  255. //          tmp->prev = Odd_end;
  256. //          Odd_end->next = tmp;
  257. //          Odd_end = tmp;
  258. //
  259. //      }
  260. //
  261. //  }
  262. //  list* t = Even_head;
  263. //  Even_head = Even_head->next;
  264. //  delete t;
  265. //  list* ttt = Odd_head;
  266. //  Odd_head = Odd_head->next;
  267. //  delete ttt;
  268. //  list* tt = Odd_end;
  269. //  Odd_end = Odd_end->prev;
  270. //  delete tt;
  271. // 
  272. //
  273. //}
  274. //
  275. void Solution(list** head, list** end)
  276. {
  277.     list* pbeg2 = new list, * pend2 = new list; //*pbeg2 и *pend2 - начало и конец второй очереди
  278.     list* tempbeg = new list, * tempend = new list;// пустышки для первого стека (чтобы не делать исключительных ситуаций с началом очреди и его конца)
  279.  
  280.     (*head)->prev = tempbeg;//вставляем пустышку в начало первого стека
  281.     tempbeg->next = *head;//думаю тут понятно как это делется (если нет то бери листик с ручкой и рисуй кружочки со связями)
  282.     *head = tempbeg;
  283.     (*end)->next = tempend;// и в конец
  284.     tempend->prev = *end;
  285.     *end = tempend;
  286.  
  287.     list* pv1 = (*head)->next;// наш счётчик (ну как int i в цикле for для массивов)
  288.     // тут у нас будет два while'a: первый для того, чтобы найти ПЕРВЫЙ нечётный элемент, второй для остальных
  289.     // зачем нам 2 while'a? Дело в том, что, когда мы запихиваем первый элемент во вторую очередь, мы работаем с вершиной-началом этой очереди,
  290.     // а с остальными мы работаем с концом(мы ведь при добавлении нового элемента меняем его конец)
  291.     while (abs(pv1->info % 2) != 1 && pv1->next != NULL)// идём нашим счётчиком от начала(68 строка) до тех пор пока не встретим нечётное число
  292.     {// либо если их вообще нет, то до конца(до NULL)
  293.         pv1 = pv1->next;
  294.     }// после этого цикла мы либо дошли до конца либо дошли до первого нечётного
  295.     if (pv1->next != NULL)// но нам нужна ситуация когда мы дойдём до первого нечётного, поэтому такой и if
  296.     {// а вот тут лучше взять листик с ручкой и всё нарисовать (в голове вряд ли что-то сделаешь)
  297.         pv1->next->prev = pv1->prev;//тут(78 и 79 строка) мы меняем связи предыдущего и следующего элементов...
  298.         pv1->prev->next = pv1->next;// ...так чтобы они были связаны друг с другом
  299.         pbeg2 = pv1;//присваиваем начало второй очереди наш текущий элемент
  300.         pbeg2->next = NULL;// расставляем NULL начала второго стека (до и после ничего ведь не идёт, мы ведь вставляем первый элемент)
  301.         pbeg2->prev = NULL;
  302.         pend2 = pbeg2;// если элемент один значит, что он и начало и конец
  303.         pv1 = pv1->next;//у нас связь для продолжения счётчика никуда не пропала поэтому идём дальше (по сравниению с массивом это i++)
  304.     }
  305.     while (pv1->next != NULL)//ну, с началом разобрались, теперь и с остальными надо(то есть сейчас пойдет работа с вершиной-концом)
  306.     {
  307.         if (abs(pv1->info % 2) == 1)// если нашли
  308.         {
  309.             pv1->prev->next = pv1->next;//как и с началом меняем свзяи предыдущих так чтобы они бли связаны друг с другом
  310.             pv1->next->prev = pv1->prev;
  311.             pend2->next = pv1;// по сути pv1 будет новым концом, поэтому следующий элемент старого конца присваиваем pv1
  312.             pv1 = pv1->next;//тут идём дальше по счётчику (i++)
  313.             pend2->next->prev = pend2;// pend2->next - новой конец, а ->prev указатель на прдыдущий, поэтому присваиваем его старому концу
  314.             pend2 = pend2->next;// наконец, переопределяем ссылку на конец (у нас до этого pend2 был старым концом)
  315.             pend2->next = NULL;// ну и после нового конца идёт NULL
  316.         }
  317.         else  pv1 = pv1->next;// если элемент чётный то просто идём дальше
  318.     }
  319.  
  320.     // тут обычный вывод
  321.     cout << "Новая очередь: " << endl;
  322.     pv1 = pbeg2;
  323.     while (pv1 != NULL)
  324.     {
  325.         cout << pv1->info << endl;
  326.         pv1 = pv1->next;
  327.     }
  328.     cout << "Остаток первой очереди: " << endl;
  329.     pv1 = (*head)->next;
  330.     while (pv1->next != NULL)
  331.     {
  332.         cout << pv1->info << endl;
  333.         pv1 = pv1->next;
  334.     }
  335.  
  336.     //пустышки которые мы создали в начале функции надо удалить и поставить указатели на вершины на свои места
  337.     *head = (*head)->next;
  338.     delete (*head)->prev;
  339.     *end = (*end)->prev;
  340.     delete (*end)->next;
  341. }// всё
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement