Advertisement
Gamerkin

5

May 26th, 2023
246
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.67 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct Node {
  6.     char val;
  7.     Node* next;
  8.  
  9.     Node(char _val) : val(_val ), next(nullptr) {}
  10. };
  11.  
  12. struct list {
  13.     Node* first;
  14.     Node* last;
  15.  
  16.     list() : first(nullptr), last(nullptr) {}
  17.  
  18.     bool is_empty() {
  19.         return first == nullptr;
  20.     }
  21.  
  22.     void push_back(char _val) {
  23.         Node* p = new Node(_val);
  24.         if (is_empty()) {
  25.             first = p;
  26.             last = p;
  27.             return;
  28.         }
  29.         last->next = p;
  30.         last = p;
  31.     }
  32.  
  33.     void push_begin(char _val)
  34.     {
  35.         Node* p = new Node(_val);
  36.         if (is_empty()) {
  37.             first = p;
  38.             last = p;
  39.             return;
  40.         }
  41.         p->val = _val;
  42.         p->next = first;
  43.         first = p;
  44.     }
  45.  
  46.     void print() {
  47.         if (is_empty()) return;
  48.         Node* p = first;
  49.         while (p) {
  50.             cout << p->val << " ";
  51.             p = p->next;
  52.         }
  53.         cout << endl;
  54.     }
  55.  
  56.     Node* find(char _val) {
  57.         Node* p = first;
  58.         while (p && p->val != _val) p = p->next;
  59.         return (p && p->val == _val) ? p : nullptr;
  60.     }
  61.  
  62.     void remove_first() {
  63.         if (is_empty()) return;
  64.         Node* p = first;
  65.         first = p->next;
  66.         delete p;
  67.     }
  68.  
  69.     void remove_last() {
  70.         if (is_empty()) return;
  71.         if (first == last) {
  72.             remove_first();
  73.             return;
  74.         }
  75.         Node* p = first;
  76.         while (p->next != last) p = p->next;
  77.         p->next = nullptr;
  78.         delete last;
  79.         last = p;
  80.     }
  81.  
  82.     void remove(char _val) {
  83.         if (is_empty()) return;
  84.         if (first->val == _val) {
  85.             remove_first();
  86.             return;
  87.         }
  88.         else if (last->val == _val) {
  89.             remove_last();
  90.             return;
  91.         }
  92.         Node* slow = first;
  93.         Node* fast = first->next;
  94.         while (fast && fast->val != _val) {
  95.             fast = fast->next;
  96.             slow = slow->next;
  97.         }
  98.         if (!fast) {
  99.             cout << "Элемент не найден" << endl;
  100.             return;
  101.         }
  102.         slow->next = fast->next;
  103.         delete fast;
  104.     }
  105.  
  106.     void longestSequence() {
  107.         Node* p = first;
  108.         int maxLength = 0;      // длина самой длинной последовательности
  109.         Node* start = nullptr;  // указатель на начало самой длинной последовательности
  110.         Node* current = p;   // текущий элемент списка
  111.  
  112.         while (current != nullptr) {
  113.             Node* temp = current;   // временный указатель на текущий элемент
  114.             int length = 0;         // длина текущей последовательности
  115.             while (temp->next != nullptr && temp->val == temp->next->val) {
  116.                 temp = temp->next;
  117.                 length++;
  118.             }
  119.             if (length > maxLength) {
  120.                 maxLength = length;
  121.                 start = current;
  122.             }
  123.             current = temp->next;
  124.         }
  125.  
  126.         if (maxLength == 0) {
  127.             cout << "No matching sequence found." << endl;
  128.         }
  129.         else {
  130.             cout << "Самая длинная последовательность: ";
  131.             for (int i = 0; i <= maxLength; i++) {
  132.                 cout << start->val;
  133.                 start = start->next;
  134.             }
  135.             cout << endl;
  136.         }
  137.     }
  138.  
  139.     void removeDuplicates() {
  140.         Node* p = first;
  141.         Node* curr = p;
  142.  
  143.         while (curr != nullptr) {
  144.             Node* temp = curr->next;
  145.             while (temp != nullptr && temp->val == curr->val) {
  146.                 curr->next = temp->next;
  147.                 delete temp;
  148.                 temp = curr->next;
  149.             }
  150.             curr = curr->next;
  151.         }
  152.     }
  153.  
  154.    /* void insertSorted(int value) {
  155.         Node* p = first;
  156.         Node* newNode = new Node(value);
  157.         if (p == nullptr || value < p->val) {
  158.             newNode->next = p;
  159.             p = newNode;
  160.         }
  161.         else {
  162.             Node* current = p;
  163.             while (current->next != nullptr && current->next->val < value) {
  164.                 current = current->next;
  165.             }
  166.             newNode->next = current->next;
  167.             current->next = newNode;
  168.         }
  169.     }
  170.  
  171.     Node* createNewList() {
  172.         Node* p = first;
  173.         Node* newList = nullptr;
  174.         while (p) {
  175.             int value = p->val;
  176.             while (value > 0) {
  177.                 int digit = value % 10;
  178.                 insertSorted(digit);
  179.                 value /= 10;
  180.             }
  181.             p = p->next;
  182.         }
  183.         return newList;
  184.     }*/
  185. };
  186.  
  187. int main()
  188. {
  189.     setlocale(0, "");
  190.     int n, size;
  191.     char a;
  192.     cout << "Использовать готовый список или создать новый? 1 2: "; cin >> n;
  193.     if (n == 1)
  194.     {
  195.         list l;
  196.         l.push_back('1');
  197.         l.push_back('2');
  198.         l.push_back('2');
  199.         l.push_back('8');
  200.         l.push_back('7');
  201.         l.print();
  202.         l.remove('7');
  203.         l.print();
  204.         l.push_begin('5');
  205.         l.print();
  206.         l.longestSequence();
  207.         l.removeDuplicates();
  208.         l.print();
  209.     }
  210.     else
  211.     {
  212.         list l;
  213.         cout << "Введите размер списка: "; cin >> size;
  214.         for (int i = 0; i < size; i++)
  215.         {
  216.             cout << "Введите элемент #" << i + 1 << ": "; cin >> a;
  217.             l.push_back(a);
  218.         }
  219.         l.print();
  220.         l.remove('3');
  221.         l.print();
  222.         l.push_begin('5');
  223.         l.print();
  224.         l.longestSequence();
  225.         l.removeDuplicates();
  226.         l.print();
  227.     }
  228.    
  229.     return 0;
  230.     system("pause");
  231. }
  232.  
  233.  /*Функция longestSequence() принимает строку и возвращает самую длинную последовательность одинаковых символов в этой строке.
  234.  
  235.  Функция removeDuplicates() принимает строку и возвращает эту же строку, но без повторяющихся символов в каждой последовательности одинаковых символов.
  236.  
  237.   Функция createNewList() принимает исходный список и возвращает новый список, в котором элементы отсортированы по возрастанию и не повторяются.
  238.  
  239.  Пример использования функций включен в функцию main().*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement