Advertisement
Bibodui

ЯМП Экз №1

Jan 23rd, 2021
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  1. /*
  2. * Создать линейный односвязный список.
  3. Из списка удалить первые два нулевых элемента,
  4. а затем вставить заданное число перед первым положительным элементом
  5. и после последнего положительного элемента.
  6. Освободить память, занимаемую элементами списка.
  7. */
  8.  
  9. #include <iostream>
  10. #include <Windows.h>
  11.  
  12. using namespace std;
  13.  
  14. struct List
  15. {
  16.     int Value;
  17.     List* pNext;
  18. };
  19.  
  20. List* head;
  21.  
  22. void Initial(List*&);
  23. void Output();
  24. void DelTwoZero(List*&);
  25. void AddTwoElem(List*&, int);
  26. void DeleteAll(List*&);
  27.  
  28. int main()
  29. {
  30.     int q;
  31.  
  32.     do
  33.     {
  34.         SetConsoleOutputCP(1251);
  35.         SetConsoleCP(1251);
  36.  
  37.         Initial(head);
  38.         Output();
  39.  
  40.         DelTwoZero(head);
  41.         Output();
  42.         cout << "Введите число:" << endl;
  43.         int elem;
  44.         cin >> elem;
  45.         AddTwoElem(head, elem);
  46.         Output();
  47.         DeleteAll(head);
  48.         cin >> q;
  49.         cout << "0. Выход" << endl;
  50.     } while (q != 0);
  51. }
  52.  
  53. void Initial(List*& head)
  54. {
  55.     head = new List;
  56.     head->Value = 0;//head выполняет роль счётчика элементов
  57.  
  58.     List* tmp = head;
  59.     tmp->pNext = nullptr;
  60.  
  61.     int elem;
  62.  
  63.     cout << "Введите элементы списка:" << endl;
  64.     cin >> elem;
  65.     while (elem != 999)
  66.     {
  67.         tmp->pNext = new List;
  68.         tmp = tmp->pNext;
  69.         tmp->Value = elem;
  70.         head->Value++;
  71.         tmp->pNext = nullptr;
  72.         cin >> elem;
  73.     }
  74. }
  75.  
  76. void DelTwoZero(List*& head)
  77. {
  78.     List* tmp = head->pNext;
  79.     List* tmpPrev = head;
  80.     int count = 0;
  81.     while (tmp != nullptr && count < 2)
  82.     {
  83.         if (tmp->Value == 0)
  84.         {
  85.             tmpPrev->pNext = tmp->pNext;
  86.             delete tmp;
  87.             tmp = tmpPrev->pNext;
  88.             head->Value--;
  89.             count++;
  90.         }
  91.         else
  92.         {
  93.             tmp = tmp->pNext;
  94.             tmpPrev = tmpPrev->pNext;
  95.         }
  96.     }
  97. }
  98.  
  99. void AddTwoElem(List*& head, int elem)
  100. {
  101.     List* tmp = head->pNext, *first, *last;
  102.     first = last = nullptr;
  103.  
  104.     while (tmp != nullptr)
  105.     {
  106.         if (first == nullptr && tmp->Value > 0)
  107.         {
  108.             first = tmp;
  109.         }
  110.  
  111.         if (tmp->Value > 0)
  112.         {
  113.             last = tmp;
  114.         }
  115.  
  116.         tmp = tmp->pNext;
  117.     }
  118.  
  119.     tmp = head->pNext;
  120.     List* PrevFirst;
  121.     PrevFirst = head;
  122.  
  123.     if (first != nullptr)
  124.     {
  125.         while (tmp != nullptr)
  126.         {
  127.             if (tmp->pNext == first)
  128.                 PrevFirst = tmp;
  129.             tmp = tmp->pNext;
  130.         }
  131.  
  132.         List* tmp2 = new List;
  133.         List* tmp3 = new List;
  134.         tmp3->Value = tmp2->Value = elem;
  135.         PrevFirst->pNext = tmp2;
  136.         tmp2->pNext = first;
  137.         tmp3->pNext = last->pNext;
  138.         last->pNext = tmp3;
  139.         head->Value += 2;
  140.     }
  141.  
  142. }
  143.  
  144. void Output()
  145. {
  146.     List* tmp = head;
  147.     cout << "Вывод списка:" << endl;
  148.     for (tmp; tmp != nullptr; tmp = tmp->pNext)
  149.         cout << tmp->Value << '\t';
  150.     cout << endl;
  151. }
  152.  
  153. void DeleteAll(List*& head)
  154. {
  155.     List* tmp;
  156.     while (head->pNext != nullptr)
  157.     {
  158.         tmp = head->pNext;
  159.         head->pNext = tmp->pNext;
  160.         delete tmp;
  161.         head->Value--;
  162.     }
  163.     delete head;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement