bogdan_obukhovskii

3.8 для Кати

May 29th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct NOT;  //элемент списка
  6. struct LIST; //список
  7.  
  8. struct NOT {
  9.     int num;
  10.     NOT* next;
  11.  
  12.     LIST* sublist;
  13. };
  14.  
  15. struct LIST {
  16.     NOT* begin;
  17.  
  18.     LIST() : begin(nullptr) {}
  19. };
  20.  
  21. //добавление числа в список
  22. void addNOT(LIST*& l, int num)
  23. {
  24.     NOT* n = new NOT;
  25.     n->sublist = nullptr;
  26.     n->num = num;
  27.     n->next = nullptr;
  28.  
  29.     if (!l->begin)
  30.     {
  31.         l->begin = n;
  32.         return;
  33.     }
  34.  
  35.     auto temp = l->begin;
  36.     while (temp->next) temp = temp->next;
  37.     temp->next = n;
  38. }
  39.  
  40. void addNOTtoHead(LIST*& l, NOT* ptr)
  41. {
  42.     if (!l->begin)
  43.     {
  44.         l->begin = ptr;
  45.         return;
  46.     }  
  47.    
  48.     auto t = l->begin;
  49.     ptr->next = t;
  50.     l->begin = ptr;
  51. }
  52.  
  53. //добавление списка последнему элементу списка
  54. void addSublist(LIST*& l, LIST* subL)
  55. {
  56.     auto temp = l->begin;
  57.     while (temp->next) temp = temp->next;
  58.     temp->sublist = subL;
  59. }
  60.  
  61. //добавление списка первому элементу списка
  62. void addSublistToHead(LIST*& l, LIST* subL)
  63. {
  64.     l->begin->sublist = subL;
  65. }
  66.  
  67. //вывод списка с подсписками
  68. void print(LIST* l, bool isSubl = false)
  69. {
  70.     auto temp = l->begin;
  71.     while (temp)
  72.     {
  73.         cout << " n " << temp->num;
  74.         if (temp->sublist) //если есть подсписок, заходим в рекурсию
  75.         {
  76.             cout << "-> { ";
  77.             print(temp->sublist, true);
  78.         }
  79.         else
  80.         {
  81.             cout << " ";
  82.         }
  83.         temp = temp->next;
  84.     }
  85.  
  86.     if (isSubl) cout << "} ";
  87. }
  88.  
  89. //поворот
  90. void reverse(LIST*& l)
  91. {
  92.     LIST* tList = new LIST;
  93.  
  94.     auto temp = l->begin;
  95.  
  96.     while (temp)
  97.     {
  98.         NOT* tN = new NOT;
  99.         tN->next = nullptr;
  100.         tN->num = temp->num;
  101.         tN->sublist = nullptr;
  102.  
  103.         addNOTtoHead(tList, tN);
  104.         if (temp->sublist)
  105.         {
  106.             reverse(temp->sublist);
  107.             addSublistToHead(tList, temp->sublist);
  108.         }
  109.  
  110.         temp = temp->next;
  111.     }
  112.  
  113.     l = tList;
  114. }
  115.  
  116. int main()
  117. {
  118.     setlocale(0, "rus");
  119.  
  120.     //создаём список
  121.     LIST* list = new LIST;
  122.  
  123.     addNOT(list, 4);
  124.     addNOT(list, 5);
  125.     addNOT(list, 6);
  126.  
  127.     //создаём подсписок
  128.     LIST* sublist = new LIST;
  129.     addNOT(sublist, 5);
  130.     addNOT(sublist, 3);
  131.     addNOT(sublist, 8);
  132.     addNOT(sublist, 9);
  133.  
  134.     //создаём подсписок для подсписка
  135.     LIST* sublist1 = new LIST;
  136.     addNOT(sublist1, 9);
  137.     addNOT(sublist1, 1);
  138.  
  139.     //теперь включаем подсписок для подсписка
  140.     addSublist(sublist, sublist1);
  141.  
  142.     //теперь включаем подсписок для списка
  143.     addSublist(list, sublist);
  144.  
  145.     //выводим
  146.     print(list);
  147.  
  148.     cout << endl;
  149.  
  150.     //поворачиваем
  151.     reverse(list);
  152.  
  153.     //выводим
  154.     print(list);
  155.  
  156.     system("pause");
  157. }
Add Comment
Please, Sign In to add comment