Bibodui

List

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