Advertisement
lossyy

list

Apr 14th, 2022
926
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.37 KB | None | 0 0
  1. #include "List.h"
  2.  
  3. List::List()
  4. {
  5.     head = nullptr;
  6. }
  7.  
  8. void List::pushElem(float data)
  9. {
  10.     if (head == nullptr)
  11.     {
  12.         head = new Node(data);
  13.     }
  14.     else
  15.     {
  16.         Node* current = this->head;
  17.         while (current->pNext != nullptr)
  18.         {
  19.             current = current->pNext;
  20.         }
  21.         current->pNext = new Node(data);
  22.     }
  23. }
  24.  
  25. void List::printElems()
  26. {
  27.     Node* current = this->head;
  28.     while (current != nullptr)
  29.     {
  30.         cout << current->data << " ";
  31.         current = current->pNext;
  32.     }
  33. }
  34.  
  35. //в цикле проходим по списку k раз
  36. //в каждом проходе текущий элемент добавляем в конец списка
  37. void List::relocElems(short k)
  38. {
  39.     Node* current = this->head;
  40.     for (int i = 0; i < k; i++)
  41.     {
  42.         this->pushElem(current->data);
  43.         current = current->pNext;
  44.     }
  45.     //после завершения работы цикла элемент с индексом [k+1] назначаем головой (head)
  46.     //предыдущие элементы автоматически отсекаются
  47.     head = current;
  48. }
  49.  
  50. /*void List::replaceMaxMinElems()
  51. {
  52.     Node* current = this->head;
  53.     int max = current->data;
  54.     int min = current->data;
  55.     int i = 0;
  56.     int maxIndex = 0;
  57.     int minIndex = 0;
  58.     //в цикле проходим по списку, ищем наибольшее/наименьшее значение и запоминаем их
  59.     //также запоминаем индексы элементов
  60.     while (current != nullptr)
  61.     {
  62.         if (current->data > max)
  63.         {
  64.             max = current->data;
  65.             maxIndex = i;
  66.         }
  67.         if (current->data < min)
  68.         {
  69.             min = current->data;
  70.             minIndex = i;
  71.         }
  72.         current = current->pNext;
  73.         i++;
  74.     }
  75.     i = 0;
  76.     current = this->head;
  77.     //присваиваем значение наибольшего элемента наименьшему и наоборот
  78.     while (current != nullptr)
  79.     {
  80.         if (i == maxIndex)
  81.             current->data = min;
  82.         if (i == minIndex)
  83.             current->data = max;
  84.         current = current->pNext;
  85.         i++;
  86.     }
  87. }
  88. */
  89.  
  90. void List::replaceMaxMinElems() {
  91.     Node* current = this->head;
  92.     Node* min = current;
  93.     Node* max = current;
  94.     Node* prev = nullptr;
  95.     Node* prevMax = head;
  96.     Node* prevMin = head;
  97.     Node* nextMax;
  98.     Node* nextMin;
  99.     Node* temphead = head;
  100.  
  101.     //поиск предыдущих max/min и предыдшествующих им элементов
  102.     while (current != nullptr)
  103.     {
  104.         if (current->data > max->data) {
  105.             max = current;
  106.             prevMax = prev;
  107.         }
  108.         if (current->data < min->data) {
  109.             min = current;
  110.             prevMin = prev;
  111.         }
  112.         prev = current;
  113.         current = current->pNext;
  114.     }
  115.  
  116.     //если максимальный элемент находится в голове списка,
  117.     //то устанавливаем его в качестве новой временной головы списка
  118.     if (max == head) {
  119.         prevMax = NULL;
  120.         temphead=min;
  121.     }
  122.     //аналогично для минимального
  123.     if (min == head) {
  124.         prevMin = NULL;
  125.         temphead =max;
  126.     }
  127.  
  128.     //элемент, следующий за максимальным/минимальным
  129.     nextMax = max->pNext;
  130.     nextMin = min->pNext;
  131.  
  132.     //если max стоит сразу после min
  133.     if (max == nextMin) {
  134.         max->pNext = min;
  135.         min->pNext = nextMax;
  136.         if (min != head)
  137.             prevMin->pNext = max;
  138.     }
  139.     //если min стоит сразу после max
  140.     else if (min == nextMax) {
  141.         min->pNext = max;
  142.         max->pNext = nextMin;
  143.         if (max != head)
  144.             prevMax->pNext = min;
  145.     }
  146.  
  147.     //если min и max не стоят рядом
  148.     else {
  149.         if (min != head)
  150.             prevMin->pNext = max;
  151.         max->pNext = nextMin;
  152.         if (max != head)
  153.             prevMax->pNext = min;
  154.         min->pNext = nextMax;
  155.     }
  156.     //устанавливаем временную голову в качестве головы списка
  157.     head = temphead;
  158. }
  159.  
  160.  
  161. int main()
  162. {
  163.     List lst;
  164.     float data;
  165.     short sizeList;
  166.     cout << "enter the size of the list" << endl;
  167.     cin >> sizeList;
  168.     for (int i = 0; i < sizeList; i++)
  169.     {
  170.         cout << "Enter the " << i + 1 << " element: ";
  171.         cin >> data;
  172.         lst.pushElem(data);
  173.     }
  174.     lst.printElems();
  175.     cout << "\nenter how much elements you'd like to relocate" << endl;
  176.     int k = 0;
  177.     cin >> k;
  178.     cout << "list with relocated elements" << endl;
  179.     if (k!=0) lst.relocElems(k);
  180.     lst.printElems();
  181.     cout << "\nlist with replaced min/max elements"
  182.         << endl;
  183.     lst.replaceMaxMinElems();
  184.     lst.printElems();
  185.     return 0;
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement