kxcoze

marina_win

Dec 17th, 2020 (edited)
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <windows.h>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. struct mnogochlen { //изначальный многолчен
  8.     float koef, stepen;
  9.     mnogochlen* next;
  10. };
  11.  
  12. typedef mnogochlen* pm;
  13.  
  14. short menu();
  15. pm create(float k, float s);
  16. void addfirst(pm& head, pm newpm);
  17. void addafter(pm p, pm newpm);
  18. void addbefore(pm& head, pm p, pm newpm);
  19. void addlast(pm& head, pm newpm);
  20. pm searchplace(pm head, float s, float k);
  21. pm search(pm head, float k, float s);
  22. void swap_elements(pm head, pm npm, int raspologenie);
  23. void init_swap(pm& head);
  24. void make_new_mnogochlen(pm& head);
  25. void print_list(pm& head);
  26. void del(pm& head, pm old);
  27. pm delete_elem(pm& head, pm old);
  28. void append_elements(pm& head);
  29. void insert_element(pm& head);
  30. void init_delete_element(pm& head);
  31. void clear(pm& head);
  32.  
  33. int main() {
  34.     SetConsoleCP(1251);
  35.     SetConsoleOutputCP(1251);
  36.     pm head = NULL;
  37.     short choice;
  38.     do {
  39.         choice = menu();
  40.         switch (choice) {
  41.         case 1:
  42.             append_elements(head);
  43.             system("pause");
  44.             break;
  45.         case 2:
  46.             cout << "Полученный многочлен: \nP(x) = ";
  47.             print_list(head);
  48.             system("pause");
  49.             break;
  50.         case 3:
  51.             insert_element(head);
  52.             system("pause");
  53.             break;
  54.         case 4:
  55.             init_delete_element(head);
  56.             system("pause");
  57.             break;
  58.         case 5:
  59.             init_swap(head);
  60.             system("pause");
  61.             break;
  62.         case 6:
  63.             cout << "Новый многочлен: \nQ(x) = ";
  64.             make_new_mnogochlen(head);
  65.             system("pause");
  66.             break;
  67.         case 7:
  68.             clear(head);
  69.             cout << "Динамический список успешно очищен!" << endl;
  70.             system("pause");
  71.             break;
  72.         case 0:
  73.             cout << "До свидания!" << endl;
  74.             return 0;
  75.         default:
  76.             cout << "Введите одно из приведенных чисел!" << endl;
  77.             system("pause");
  78.             cin.clear();
  79.             break;
  80.         }
  81.  
  82.     } while (choice);
  83.     return 0;
  84. }
  85.  
  86. short menu() { // меню
  87.     short n;
  88.     system("cls");
  89.     cout << "МЕНЮ" << endl;
  90.     cout << "Введите [1] для ввода данных" << endl;
  91.     cout << "Введите [2] для просмотра введенных данных" << endl;
  92.     cout << "Введите [3] для вставки элемента" << endl;
  93.     cout << "Введите [4] для удаление элемента" << endl;
  94.     cout << "Введите [5] для перемещения элемента в произвольную позицию списка" << endl;
  95.     cout << "Введите [6] для формирования нового многочлена" << endl;
  96.     cout << "Введите [7] для очистки динамического списка" << endl;
  97.     cout << "Введите [0] для выхода" << endl;
  98.     cout << ">> ";
  99.     cin >> n;
  100.     return n;
  101. }
  102.  
  103. pm create(float k, float s) { //создание нового узла
  104.     pm newpm = new mnogochlen;
  105.     newpm->koef = k;
  106.     newpm->stepen = s;
  107.     newpm->next = NULL;
  108.     return newpm;
  109. }
  110.  
  111. void addfirst(pm& head, pm newpm) { //добавление первого узла в начало списка
  112.     newpm->next = head;
  113.     head = newpm;
  114. }
  115.  
  116. void addafter(pm p, pm newpm) { //добавление остальных узлов в структуру
  117.     newpm->next = p->next;
  118.     p->next = newpm;
  119. }
  120.  
  121. void addbefore(pm& head, pm p, pm newpm) { //добавление узла перед заданным
  122.     pm q = head;
  123.     if (head == p) {
  124.         addfirst(head, newpm);
  125.         return;
  126.     }
  127.     while (q && q->next != p)
  128.         q = q->next;
  129.     if (q)
  130.         addafter(q, newpm);
  131. }
  132.  
  133. void addlast(pm& head, pm newpm) { //добавление последнего элемента
  134.     pm q = head;
  135.     if (head == NULL) {
  136.         addfirst(head, newpm);
  137.         return;
  138.     }
  139.     while (q->next)
  140.         q = q->next;
  141.     addafter(q, newpm);
  142. }
  143.  
  144. pm searchplace(pm head, float s, float k) {//поиск месторасположения узла
  145.     pm q = head;
  146.     while (q && q->koef == k && q->stepen == s)
  147.         q = q->next;
  148.     return q;
  149. }
  150.  
  151. pm search(pm head, float k, float s) { // поиск элемента по коэф и степени
  152.     while (head != NULL) {
  153.         if (head->stepen == s && head->koef == k)
  154.             return head;
  155.         head = head->next;
  156.     }
  157. }
  158.  
  159. void swap_elements(pm head, pm npm, int raspologenie) {
  160.     int k = 1;
  161.     bool flag = false;
  162.     while (head != NULL) {
  163.         cout << k << ' ' << raspologenie << '\n';
  164.         if (k == raspologenie) {
  165.             flag = true;
  166.             break;
  167.         }
  168.         head = head->next;
  169.         k++;
  170.     }
  171.  
  172.     if (flag) {
  173.         swap(head->koef, npm->koef);
  174.         swap(head->stepen, npm->stepen);
  175.         cout << "Одночлены успешно перемещены!\n";
  176.     }
  177.     else {
  178.         if (k < raspologenie || raspologenie < 0)
  179.             cout << "Указанное место не существует в многочлене!\n";
  180.     }
  181. }
  182.  
  183. void init_swap(pm& head) { // перемещение элемента в произвольную позицию
  184.     pm t = head;
  185.     cout << "Введите через пробел коэффициент и степень элемента, который надо переместить: \n";
  186.     float k, s;
  187.     cin >> k >> s;
  188.     int mesto;
  189.     cout << "Введите номер позиции на место которой надо вставить данный элемент: \n";
  190.     cin >> mesto;
  191.     pm p = search(head, s, k);
  192.     swap_elements(head, p, mesto);
  193. }
  194.  
  195. void make_new_mnogochlen(pm& head) { //формирование нового многочлена
  196.     pm maintemp = head;
  197.     while (maintemp != NULL) {
  198.         float q_sum = 0;
  199.         pm temp = maintemp->next;
  200.         while (temp != NULL) {
  201.             if (temp->stepen == maintemp->stepen) {
  202.                 q_sum += temp->koef;
  203.                 temp = delete_elem(maintemp, temp);
  204.                 continue;
  205.             }
  206.             temp = temp->next;
  207.         }
  208.         maintemp->koef += q_sum;
  209.         maintemp = maintemp->next;
  210.     }
  211.     print_list(head);
  212. }
  213.  
  214. void print_list(pm& head) { //вывод
  215.     pm newpm = head;
  216.     if (newpm == NULL)
  217.         cout << "К сожалению, ваш список пока пуст! Перейдите в пункт [1], чтобы исправить это" << endl;
  218.     else {
  219.         while (newpm != NULL) {
  220.             string ans = "", oper = " + ";
  221.             if (newpm->koef < 0)
  222.                 oper = " - ";
  223.  
  224.             if (newpm != head)
  225.                 ans += oper;
  226.             if (abs(newpm->koef) != 1)
  227.                 ans += to_string((int)newpm->koef);
  228.             ans += "x";
  229.             if (newpm->stepen != 1)
  230.                 ans += "^" + to_string((int)newpm->stepen);
  231.             cout << ans;
  232.             newpm = newpm->next;
  233.         }
  234.     }
  235.     cout << endl;
  236. }
  237.  
  238. void del(pm& head, pm old) { //удаление элемента
  239.     pm q = head;
  240.     if (head == old)
  241.         head = old->next;
  242.     else {
  243.         while (q && q->next != old)
  244.             q = q->next;
  245.         if (q == NULL)
  246.             return;
  247.         q->next = old->next;
  248.     }
  249.     delete old;
  250. }
  251.  
  252. pm delete_elem(pm& head, pm old) { //удаление элемента
  253.     pm q = head;
  254.     if (head == old)
  255.         head = old->next;
  256.     else {
  257.         while (q && q->next != old)
  258.             q = q->next;
  259.         if (q == NULL)
  260.             return NULL;
  261.         q->next = old->next;
  262.     }
  263.     delete old;
  264.  
  265.     return q->next;
  266. }
  267.  
  268. void append_elements(pm& head) { // ввод данных
  269.     pm new_element, where;
  270.     int kol;
  271.     cout << "Введите количество элементов для нашего многочлена: ";
  272.     cin >> kol;
  273.     for (int i = 1; i <= kol; i++) {
  274.         float st, ko;
  275.         cout << "Введите через пробел коэффициент и степень для " << i << " одночлена: ";
  276.         cin >> ko >> st;
  277.         new_element = create(ko, st);
  278.         where = searchplace(head, ko, st);
  279.         if (!where)
  280.             addlast(head, new_element);
  281.         else
  282.             addbefore(head, where, new_element);
  283.     }
  284.     cout << "Элементы занесены в список. Перейдите в пункт [2] для просмотра." << endl;
  285.  
  286. }
  287.  
  288. void insert_element(pm& head) {
  289.     pm new_element, temp = head;
  290.     int place, cur_place = 1;
  291.     float koeff, stepen;
  292.     cout << "Введите через пробел коэффициент и степень элемента: \n";
  293.     cin >> koeff >> stepen;
  294.     cout << "Введите место вставки элемента многочлена: \n";
  295.     cin >> place;
  296.  
  297.     bool flag = false;
  298.     while (temp != NULL) {
  299.         if (cur_place == place) {
  300.             new_element = create(koeff, stepen);
  301.             addbefore(head, temp, new_element);
  302.  
  303.             flag = true;
  304.             break;
  305.         }
  306.         temp = temp->next;
  307.         cur_place++;
  308.     }
  309.     if (flag)
  310.         cout << "Элемент успешно вставлен!\n";
  311.     else {
  312.         if (cur_place < place || place < 0)
  313.             cout << "Указанное место не существует в многочлене!\n";
  314.         else
  315.             cout << "Элемент не удалось вставить!\n";
  316.     }
  317. }
  318.  
  319. void init_delete_element(pm& head) { //удаление
  320.     float step, ko;
  321.     cout << "Введите через пробел коэффициент и степень того элемента, который надо удалить: ";
  322.     cin >> ko >> step;
  323.     pm udal = search(head, ko, step);
  324.     if (udal) {
  325.         del(head, udal);
  326.         cout << "Элемент успешно удален!" << endl;
  327.         print_list(head);
  328.     }
  329.     else
  330.         cout << "Такого элемента не существует!" << endl;
  331. }
  332.  
  333. void clear(pm& head) {
  334.     if (head != NULL) {
  335.         clear(head->next);
  336.         delete head;
  337.         head = NULL;
  338.     }
  339. }
  340.  
  341.  
  342.  
  343. /* Тестовый набор данных для пункта [6], просто CTRL+C и CTRL+V
  344. 1
  345. 17
  346. 4 3
  347. 4 5
  348. 2 5
  349. 6 7
  350. 6 5
  351. 1 3
  352. 1 5
  353. 6 4
  354. 2 3
  355. 1 3
  356. 1 2
  357. 1 2
  358. 2 5
  359. 3 4
  360. 2 4
  361. 8 9
  362. 5 4
  363. */
Add Comment
Please, Sign In to add comment