Advertisement
Guest User

Untitled

a guest
Jun 20th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.93 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct element {
  6.     element *prev;
  7.     int value;
  8.     element *start2; //wskaznik na poczatek podlisty w liscie (tam wartosci)
  9.     element *end2; //wskaznik na koniec podlisty w liscie (tam wartosci)
  10.     element *next;
  11. };
  12.  
  13. void newList(element **start, element **end, int ans1, int ans2) {
  14.     *start = new element;
  15.     *end = *start;
  16.     (*start)->next = NULL;
  17.     (*start)->prev = NULL;
  18.     (*start)->value = ans1;
  19.  
  20.     (*start)->start2 = new element;
  21.     (*start)->end2 = (*start)->start2;
  22.     (*start)->start2->next = NULL;
  23.     (*start)->start2->prev = NULL;
  24.     (*start)->start2->value = ans2;
  25. }
  26.  
  27. int numElements(element *start) {
  28.     int counter = 0;
  29.     while (start != NULL) {
  30.         counter++;
  31.         start = start->next;
  32.     }
  33.     return counter;
  34. }
  35.  
  36. void sortList(element *start) {
  37.     int numElem = numElements(start);
  38.     element *ptr1 = start;
  39.     element *ptr2;
  40.     int container;
  41.  
  42.     if (numElem > 1) {
  43.         for (int i = 0; i < numElem; i++) {
  44.             ptr2 = ptr1;
  45.             for (int j = 0; j < numElem - 1; j++) {
  46.                 if (ptr2->value < ptr2->next->value) {
  47.                     container = ptr2->value;
  48.                     ptr2->value = ptr2->next->value;
  49.                     ptr2->next->value = container;
  50.                 }
  51.                 ptr2 = ptr2->next;
  52.             }
  53.         }
  54.     }
  55. }
  56.  
  57. void printList(element *start) {
  58.     if (start != NULL) {
  59.         sortList(start);
  60.         while (start != NULL) {
  61.             printf("%d ", start->value);
  62.             start = start->next;
  63.         }
  64.     }
  65.     else
  66.         printf("na");
  67.  
  68.     printf("\n");
  69. }
  70.  
  71. void addFirst(element *&start, int val) {
  72.     element *newElem = new element;
  73.     newElem->value = val;
  74.     newElem->next = start;
  75.     newElem->prev = NULL;
  76.     start->prev = newElem;
  77.     start = newElem;
  78. }
  79.  
  80. element* addLast(element *&end, int val) {
  81.     element *newElem = new element;
  82.     newElem->value = val;
  83.     newElem->next = NULL;
  84.     newElem->prev = end;
  85.     end->next = newElem;
  86.     end = newElem;
  87.     return newElem;
  88. }
  89.  
  90. element* returnElement(element *start, int x) {
  91.     if (x < 1)
  92.         return NULL;
  93.     for (int i = 1; i < x && start != NULL; i++)
  94.         start = start->next;
  95.     return start;
  96. }
  97.  
  98. bool change(element *start, int ind, int val) {
  99.     element *ptr = returnElement(start, ind);
  100.     if (ptr != NULL) {
  101.         ptr->value = val;
  102.         return true;
  103.     }
  104.     else return false;
  105. }
  106.  
  107. void putBefore(element *ptr, int val) {
  108.     element *newElem = new element;
  109.     newElem->value = val;
  110.     newElem->next = ptr;
  111.     newElem->prev = ptr->prev;
  112.     ptr->prev->next = newElem;
  113.     ptr->prev = newElem;
  114. }
  115.  
  116. void putAfter(element *ptr, int val) {
  117.     element *newElem = new element;
  118.     newElem->value = val;
  119.     newElem->next = ptr->next;
  120.     newElem->prev = ptr;
  121.     ptr->next->prev = newElem;
  122.     ptr->next = newElem;
  123. }
  124.  
  125. //Funkcja dodaje element, zachowujac kolejnosc malejaca wartosci 'value'
  126. element* insert(element **start, element **end, int val) {
  127.     element *ptr = *start;
  128.  
  129.     while (ptr->value > val && ptr->next != NULL)
  130.         ptr = ptr->next;
  131.  
  132.     if (ptr->value > val) {
  133.         if (ptr->next == NULL) {
  134.             addLast(*end, val);
  135.             return *end;
  136.         }
  137.         else {
  138.             putAfter(ptr, val);
  139.             return ptr->next;
  140.         }
  141.     }
  142.     else {
  143.         if (ptr->prev == NULL) {
  144.             addFirst(*start, val);
  145.             return *start;
  146.         }
  147.         else {
  148.             putBefore(ptr, val);
  149.             return ptr->prev;
  150.         }
  151.     }
  152.     return NULL;
  153. }
  154.  
  155. element* search(element *start, int szukany) {
  156.     while (start != NULL && start->value != szukany)
  157.         start = start->next;
  158.  
  159.     if (start == NULL)
  160.         return NULL;
  161.     else
  162.         return start;
  163. }
  164.  
  165. bool deleteFirst(element *&start) {
  166.     if (start != NULL && start->next != NULL) {
  167.         element *temp;
  168.         temp = start->next;
  169.         delete start;
  170.         start = temp;
  171.         start->prev = NULL;
  172.         return true;
  173.     }
  174.     return false;
  175. }
  176.  
  177. bool deleteLast(element *&end) {
  178.     if (end != NULL && end->prev != NULL) {
  179.         element *temp;
  180.         temp = end->prev;
  181.         delete end;
  182.         end = temp;
  183.         end->next = NULL;
  184.         return true;
  185.     }
  186.     return false;
  187. }
  188.  
  189. bool deleteElement(element *ptr) {
  190.     if (ptr != NULL && ptr->next != NULL && ptr->prev != NULL) {
  191.         ptr->prev->next = ptr->next;
  192.         ptr->next->prev = ptr->prev;
  193.         delete ptr;
  194.         return true;
  195.     }
  196.     return false;
  197. }
  198.  
  199. void freeList(element *&start, element *&end) {
  200.     element *temp;
  201.     while (start != NULL) {
  202.         temp = start;
  203.         start = start->next;
  204.         delete temp;
  205.     }
  206.     end = NULL;
  207. }
  208.  
  209. void aFun(element **start, element **end, int ans1, int ans2) {
  210.     //Jesli lista nie istnieje, to tworzymy ja i wypelniamy od razu potrzebnymi danymi (problem z glowy)
  211.     if (*start == NULL)
  212.         newList(start, end, ans1, ans2);
  213.  
  214.     else {
  215.         element *ptr = search(*start, ans1);
  216.         //Sprawdzamy czy group o numerze ans1 istnieje:
  217.         //1) Jesli tak, to ptr = wskaznik na ta grupke na liscie
  218.         //2) Jesli nie, to ptr = NULL
  219.  
  220.         //Jesli nie znalazlo nam grupy o numerze ans1: funkcja wrzuca ans1 na liste, zachowujac kolejnosc malejaca (tworzymy grupe)
  221.         if (ptr == NULL) {
  222.             ptr = addLast(*end, ans1);
  223.             //przy okazji zwraca wskaznik na wlasnie dodany element i wykorzystujemy go do utworzenia podlisty
  224.             ptr->start2 = new element;          
  225.             ptr->start2->next = NULL;
  226.             ptr->start2->prev = NULL;
  227.             ptr->end2 = ptr->start2;
  228.             ptr->start2->value = ans2;
  229.         }
  230.         else {
  231.             addLast(ptr->end2, ans2);
  232.         }
  233.     }
  234. }
  235.  
  236. void pFun(element *start, int ans1) {
  237.     element *ptr = search(start, ans1);
  238.     if (ptr != NULL) {
  239.         printList(ptr->start2);
  240.     }
  241.     else
  242.         printf("na\n");
  243. }
  244.  
  245. void iFun(element **start, element **end, int ans1, int ans2, int ans3) {
  246.     element *ptr = search(*start, ans1);
  247.  
  248.     //jesli jest taka grupa
  249.     if (ptr != NULL) {
  250.         //nowy wskaznik, dzialajacy w podliscie
  251.         element *ptr2 = search(ptr->start2, ans2);
  252.         if (ptr2 != NULL) ptr2->value = ans3;
  253.         else
  254.             printf("na\n");
  255.     }
  256.     else
  257.         printf("na\n");
  258. }
  259.  
  260. element *MaxValue(element *start) {
  261.     element *max = start;
  262.     while (start != NULL) {
  263.         if (start->value > max->value)
  264.             max = start;
  265.         start = start->next;
  266.     }
  267.     return max;
  268. }
  269.  
  270. void eFun(element **start, element **end, int ans1) {
  271.     element *ptr = search(*start, ans1);
  272.     if (ptr != NULL) {
  273.         element *ptrValue = MaxValue(ptr->start2);
  274.         printf("%d\n", ptrValue->value);
  275.  
  276.         //Czy wartosc, ktora mamy usunac byla jedyna na liscie? Jesli tak, usun takze grupe
  277.         if (ptrValue->prev == NULL) {
  278.             if (ptrValue->next == NULL) {
  279.                 freeList(ptr->start2, ptr->end2);
  280.  
  281.                 //Usuwanie elementu glownej listy
  282.                 if (ptr->prev == NULL) {
  283.                     if (ptr->next == NULL) freeList(*start, *end);
  284.                     else deleteFirst(*start);
  285.                 }
  286.                 else if (ptr->next == NULL)
  287.                     deleteLast(*end);
  288.                 else
  289.                     deleteElement(ptr);
  290.             }
  291.             else deleteFirst(ptr->start2);
  292.         }
  293.         else if (ptrValue->next == NULL)
  294.             deleteLast(ptr->end2);
  295.         else
  296.             deleteElement(ptrValue);
  297.  
  298.     }
  299.     else
  300.         printf("na\n");
  301. }
  302.  
  303. void mFun(element **start, element **end, int ans1, int ans2) {
  304.     element *group1 = search(*start, ans1);
  305.     element *group2 = search(*start, ans2);
  306.  
  307.     if (group2 != NULL) {
  308.  
  309.         if (group1 == NULL) {
  310.             //Jesli grupa 1 nie istnieje, to zmieniemay nazwe na grupy2
  311.             group2->value = ans1;
  312.         }
  313.         else {
  314.             group1->end2->next = group2->start2;
  315.             group2->start2->prev = group1->end2;
  316.             group1->end2 = group2->end2;
  317.  
  318.             //Jesli nie udalo sie usunac elementu, to znaczy, ze element byl ostatni lub pierwszy
  319.             if (!deleteElement(group2)) {
  320.                 if (group2->prev == NULL) deleteFirst(*start);
  321.                 else deleteLast(*end);
  322.             }
  323.         }
  324.     }
  325. }
  326.  
  327.  
  328. int main() {
  329.     element *start = NULL;
  330.     element *end = NULL;
  331.  
  332.     int nrOfOperations;
  333.     char operation;
  334.     int ans1, ans2, ans3;
  335.  
  336.     scanf("%d", &nrOfOperations);
  337.  
  338.     for (int i = 0; i < nrOfOperations; i++) {
  339.  
  340.         scanf(" %c", &operation);
  341.  
  342.         switch (operation) {
  343.         case 'a':
  344.             scanf("%d %d", &ans1, &ans2);
  345.             aFun(&start, &end, ans1, ans2);
  346.             break;
  347.         case 'e':
  348.             scanf("%d", &ans1);
  349.             eFun(&start, &end, ans1);
  350.             break;
  351.         case 'p':
  352.             scanf("%d", &ans1);
  353.             pFun(start, ans1);
  354.             break;
  355.         case 'm':
  356.             scanf("%d %d", &ans1, &ans2);
  357.             mFun(&start, &end, ans1, ans2);
  358.             break;
  359.         case 'i':
  360.             scanf("%d %d %d", &ans1, &ans2, &ans3);
  361.             iFun(&start, &end, ans1, ans2, ans3);
  362.             break;
  363.         default:
  364.             printf("na\n");
  365.             break;
  366.         }
  367.     }
  368.  
  369.     //system("pause");
  370.     return 0;
  371. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement