Advertisement
Bibodui

Doubly linked list

Dec 9th, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <Windows.h>
  4.  
  5. using namespace std;
  6.  
  7. struct Node
  8. {
  9.     int Value;
  10.     Node* pNext;
  11.     Node* pPrev;
  12. };
  13.  
  14. Node* head;//заглавное звено (голова)
  15. Node* tail;//конечное звено (хвост)
  16.  
  17. void Initial();
  18. Node* SearchForward(int);
  19. Node* SearchBack(int);
  20. void AddAfter(int);
  21. void AddBefore(int);
  22. void DeleteNode(int);
  23. void DeleteList();
  24. void OutputForward();
  25. void OutputBack();
  26.  
  27. int main()
  28. {
  29.     int q;
  30.  
  31.     do
  32.     {
  33.         SetConsoleOutputCP(1251);
  34.         SetConsoleCP(1251);
  35.  
  36.         cout << "Выберите действие:" << endl;
  37.         cout << "1. Ввести элементы списка" << endl;
  38.         cout << "2. Найти элемент с заданным значением с начала списка" << endl;
  39.         cout << "3. Найти элемент с заданным значением с конца списка" << endl;
  40.         cout << "4. Добавить элемент до элемента с заданным значением" << endl;
  41.         cout << "5. Добавить элемент после элемента с заданным значением" << endl;
  42.         cout << "6. Удалить элемент с заданным значением" << endl;
  43.         cout << "7. Удалить список" << endl;
  44.         cout << "8. Вывести список с начала" << endl;
  45.         cout << "9. Вывести список с конца" << endl;
  46.         cout << "0. Выход" << endl;
  47.  
  48.         cin >> q;
  49.  
  50.         if (q == 1)
  51.         {
  52.             Initial();
  53.         }
  54.         else if (q == 2)
  55.         {
  56.             int num;
  57.             cout << "Введите искомое значение:" << endl;
  58.             cin >> num;
  59.             cout << SearchForward(num) << endl;
  60.         }
  61.         else if (q == 3)
  62.         {
  63.             int num;
  64.             cout << "Введите искомое значение:" << endl;
  65.             cin >> num;
  66.             cout << SearchBack(num) << endl;
  67.         }
  68.         else if (q == 4)
  69.         {
  70.             int num;
  71.             cout << "Введите искомое значение:" << endl;
  72.             cin >> num;
  73.             AddBefore(num);
  74.         }
  75.         else if (q == 5)
  76.         {
  77.             int num;
  78.             cout << "Введите искомое значение:" << endl;
  79.             cin >> num;
  80.             AddAfter(num);
  81.         }
  82.         else if (q == 6)
  83.         {
  84.             int num;
  85.             cout << "Введите искомое значение:" << endl;
  86.             cin >> num;
  87.             DeleteNode(num);
  88.         }
  89.         else if (q == 7)
  90.         {
  91.             cout << "Удаление списка..." << endl;
  92.             DeleteList();
  93.         }
  94.         else if (q == 8)
  95.             OutputForward();
  96.         else if (q == 9)
  97.             OutputBack();
  98.  
  99.     } while (q != 0);
  100. }
  101.  
  102. void Initial()
  103. {
  104.     head = new Node;
  105.     head->Value = 0;//head выполняет роль счётчика элементов
  106.     head->pNext = nullptr;
  107.     head->pPrev = nullptr;
  108.  
  109.     Node* tmp = head;//tmp - "рабочий" указатель
  110.  
  111.     int elem;
  112.  
  113.     cout << "Введите элементы списка:" << endl;
  114.     cin >> elem;
  115.     while (elem != 0)
  116.     {
  117.         tmp->pNext = new Node;
  118.         tmp->pNext->pPrev = tmp;
  119.         tmp = tmp->pNext;
  120.         tmp->pNext = nullptr;
  121.         tmp->Value = elem;
  122.         head->Value++;
  123.         cin >> elem;
  124.     }
  125.  
  126.     tail = tmp;
  127. }
  128.  
  129. Node* SearchForward(int num)//функция выводит адрес элемента с заданным значением
  130. {
  131.     Node* tmp = head->pNext;
  132.  
  133.     while (tmp != nullptr)
  134.     {
  135.         if (tmp->Value == num)
  136.             return tmp;
  137.         tmp = tmp->pNext;
  138.     }
  139.  
  140.     cout << "Такого элемента нет в списке" << endl;
  141.  
  142.     return nullptr;
  143. }
  144.  
  145. Node* SearchBack(int num)
  146. {
  147.     Node* tmp = tail;
  148.  
  149.     while (tmp != head)
  150.     {
  151.         if (tmp->Value == num)
  152.             return tmp;
  153.         tmp = tmp->pPrev;
  154.     }
  155.     cout << "Такого элемента нет в списке" << endl;
  156.  
  157.     return nullptr;
  158. }
  159.  
  160. void AddAfter(int num)
  161. {
  162.     Node* elem = SearchForward(num), * tmp = elem, *tmp2 = new Node;
  163.     //tmp - иходное звено списка, tmp2 - звено, которое нужно добавить
  164.  
  165.     if (tmp != nullptr && tmp->pNext != nullptr)
  166.     {
  167.         cout << "Введите значение для нового элемента:" << endl;
  168.         cin >> tmp2->Value;
  169.         tmp2->pNext = tmp->pNext;//настраиваем указатели нового звена на звенья списка
  170.         tmp2->pPrev = tmp; //есть ли разница между этим <-- и этим -->  tmp2->pPrev = tmp->pNext->pPrev;
  171.         tmp->pNext->pPrev = tmp2;//настраиваем указатели звеньев списка на новое звено
  172.         tmp->pNext = tmp2;
  173.         head->Value++;
  174.     }
  175.     else if (tmp != nullptr)//в случае, если нужно добавить звено после последнего звена списка
  176.     {
  177.         cout << "Введите значение для нового элемента:" << endl;
  178.         cin >> tmp2->Value;
  179.         tmp2->pNext = nullptr;
  180.         tmp2->pPrev = tmp;
  181.         tmp->pNext = tmp2;
  182.         head->Value++;
  183.         tail = tmp2;
  184.     }
  185. }
  186.  
  187. void AddBefore(int num)
  188. {
  189.     Node* elem = SearchForward(num), * tmp = elem, *tmp2 = new Node;
  190.     //tmp - иходное звено списка, tmp2 - звено, которое нужно добавить
  191.  
  192.     if (tmp != nullptr)
  193.     {
  194.         cout << "Введите значение для нового элемента:" << endl;
  195.         cin >> tmp2->Value;
  196.         tmp2->pNext = tmp;
  197.         tmp2->pPrev = tmp->pPrev;
  198.         tmp->pPrev->pNext = tmp2;
  199.         tmp->pPrev = tmp2;
  200.         head->Value++;
  201.     }
  202. }
  203.  
  204. void DeleteNode(int num)
  205. {
  206.     Node* elem = SearchForward(num), * tmp = elem;
  207.  
  208.     if (tmp != nullptr && tmp->pNext == nullptr)
  209.     {
  210.         tmp->pPrev->pNext = nullptr;
  211.         tail = tmp->pPrev;
  212.         delete tmp;
  213.     }
  214.     else if (tmp != nullptr)
  215.     {
  216.         tmp->pPrev->pNext = tmp->pNext;
  217.         tmp->pNext->pPrev = tmp->pPrev;
  218.         delete tmp;
  219.     }
  220. }
  221.  
  222. void DeleteList()
  223. {
  224.     Node* tmp = tail;
  225.  
  226.     while (tail != head)
  227.     {
  228.         tail = tail->pPrev;
  229.         delete tmp;
  230.         tmp = tail;
  231.         head->Value--;
  232.         tail->pNext = nullptr;
  233.     }
  234. }
  235.  
  236. void OutputForward()//Вывод списка от его начала
  237. {
  238.     Node* tmp = head;
  239.     cout << "Вывод списка:" << endl;
  240.     for (tmp; tmp != nullptr; tmp = tmp->pNext)
  241.         cout << tmp->Value << '\t';
  242.     cout << endl;
  243. }
  244.  
  245. void OutputBack()
  246. {
  247.     Node* tmp = tail;
  248.     cout << "Вывод списка:" << endl;
  249.     cout << head->Value << '\t';
  250.     for (tmp; tmp != head; tmp = tmp->pPrev)
  251.         cout << tmp->Value << '\t';
  252.     cout << endl;
  253. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement