Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <windows.h>
- #include <string>
- using namespace std;
- struct mnogochlen { //изначальный многолчен
- float koef, stepen;
- mnogochlen* next;
- };
- typedef mnogochlen* pm;
- short menu();
- pm create(float k, float s);
- void addfirst(pm& head, pm newpm);
- void addafter(pm p, pm newpm);
- void addbefore(pm& head, pm p, pm newpm);
- void addlast(pm& head, pm newpm);
- pm searchplace(pm head, float s, float k);
- pm search(pm head, float k, float s);
- void swap_elements(pm head, pm npm, int raspologenie);
- void init_swap(pm& head);
- void make_new_mnogochlen(pm& head);
- void print_list(pm& head);
- void del(pm& head, pm old);
- pm delete_elem(pm& head, pm old);
- void append_elements(pm& head);
- void insert_element(pm& head);
- void init_delete_element(pm& head);
- void clear(pm& head);
- int main() {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- pm head = NULL;
- short choice;
- do {
- choice = menu();
- switch (choice) {
- case 1:
- append_elements(head);
- system("pause");
- break;
- case 2:
- cout << "Полученный многочлен: \nP(x) = ";
- print_list(head);
- system("pause");
- break;
- case 3:
- insert_element(head);
- system("pause");
- break;
- case 4:
- init_delete_element(head);
- system("pause");
- break;
- case 5:
- init_swap(head);
- system("pause");
- break;
- case 6:
- cout << "Новый многочлен: \nQ(x) = ";
- make_new_mnogochlen(head);
- system("pause");
- break;
- case 7:
- clear(head);
- cout << "Динамический список успешно очищен!" << endl;
- system("pause");
- break;
- case 0:
- cout << "До свидания!" << endl;
- return 0;
- default:
- cout << "Введите одно из приведенных чисел!" << endl;
- system("pause");
- cin.clear();
- break;
- }
- } while (choice);
- return 0;
- }
- short menu() { // меню
- short n;
- system("cls");
- cout << "МЕНЮ" << endl;
- cout << "Введите [1] для ввода данных" << endl;
- cout << "Введите [2] для просмотра введенных данных" << endl;
- cout << "Введите [3] для вставки элемента" << endl;
- cout << "Введите [4] для удаление элемента" << endl;
- cout << "Введите [5] для перемещения элемента в произвольную позицию списка" << endl;
- cout << "Введите [6] для формирования нового многочлена" << endl;
- cout << "Введите [7] для очистки динамического списка" << endl;
- cout << "Введите [0] для выхода" << endl;
- cout << ">> ";
- cin >> n;
- return n;
- }
- pm create(float k, float s) { //создание нового узла
- pm newpm = new mnogochlen;
- newpm->koef = k;
- newpm->stepen = s;
- newpm->next = NULL;
- return newpm;
- }
- void addfirst(pm& head, pm newpm) { //добавление первого узла в начало списка
- newpm->next = head;
- head = newpm;
- }
- void addafter(pm p, pm newpm) { //добавление остальных узлов в структуру
- newpm->next = p->next;
- p->next = newpm;
- }
- void addbefore(pm& head, pm p, pm newpm) { //добавление узла перед заданным
- pm q = head;
- if (head == p) {
- addfirst(head, newpm);
- return;
- }
- while (q && q->next != p)
- q = q->next;
- if (q)
- addafter(q, newpm);
- }
- void addlast(pm& head, pm newpm) { //добавление последнего элемента
- pm q = head;
- if (head == NULL) {
- addfirst(head, newpm);
- return;
- }
- while (q->next)
- q = q->next;
- addafter(q, newpm);
- }
- pm searchplace(pm head, float s, float k) {//поиск месторасположения узла
- pm q = head;
- while (q && q->koef == k && q->stepen == s)
- q = q->next;
- return q;
- }
- pm search(pm head, float k, float s) { // поиск элемента по коэф и степени
- while (head != NULL) {
- if (head->stepen == s && head->koef == k)
- return head;
- head = head->next;
- }
- }
- void swap_elements(pm head, pm npm, int raspologenie) {
- int k = 1;
- bool flag = false;
- while (head != NULL) {
- cout << k << ' ' << raspologenie << '\n';
- if (k == raspologenie) {
- flag = true;
- break;
- }
- head = head->next;
- k++;
- }
- if (flag) {
- swap(head->koef, npm->koef);
- swap(head->stepen, npm->stepen);
- cout << "Одночлены успешно перемещены!\n";
- }
- else {
- if (k < raspologenie || raspologenie < 0)
- cout << "Указанное место не существует в многочлене!\n";
- }
- }
- void init_swap(pm& head) { // перемещение элемента в произвольную позицию
- pm t = head;
- cout << "Введите через пробел коэффициент и степень элемента, который надо переместить: \n";
- float k, s;
- cin >> k >> s;
- int mesto;
- cout << "Введите номер позиции на место которой надо вставить данный элемент: \n";
- cin >> mesto;
- pm p = search(head, s, k);
- swap_elements(head, p, mesto);
- }
- void make_new_mnogochlen(pm& head) { //формирование нового многочлена
- pm maintemp = head;
- while (maintemp != NULL) {
- float q_sum = 0;
- pm temp = maintemp->next;
- while (temp != NULL) {
- if (temp->stepen == maintemp->stepen) {
- q_sum += temp->koef;
- temp = delete_elem(maintemp, temp);
- continue;
- }
- temp = temp->next;
- }
- maintemp->koef += q_sum;
- maintemp = maintemp->next;
- }
- print_list(head);
- }
- void print_list(pm& head) { //вывод
- pm newpm = head;
- if (newpm == NULL)
- cout << "К сожалению, ваш список пока пуст! Перейдите в пункт [1], чтобы исправить это" << endl;
- else {
- while (newpm != NULL) {
- string ans = "", oper = " + ";
- if (newpm->koef < 0)
- oper = " - ";
- if (newpm != head)
- ans += oper;
- if (abs(newpm->koef) != 1)
- ans += to_string((int)newpm->koef);
- ans += "x";
- if (newpm->stepen != 1)
- ans += "^" + to_string((int)newpm->stepen);
- cout << ans;
- newpm = newpm->next;
- }
- }
- cout << endl;
- }
- void del(pm& head, pm old) { //удаление элемента
- pm q = head;
- if (head == old)
- head = old->next;
- else {
- while (q && q->next != old)
- q = q->next;
- if (q == NULL)
- return;
- q->next = old->next;
- }
- delete old;
- }
- pm delete_elem(pm& head, pm old) { //удаление элемента
- pm q = head;
- if (head == old)
- head = old->next;
- else {
- while (q && q->next != old)
- q = q->next;
- if (q == NULL)
- return NULL;
- q->next = old->next;
- }
- delete old;
- return q->next;
- }
- void append_elements(pm& head) { // ввод данных
- pm new_element, where;
- int kol;
- cout << "Введите количество элементов для нашего многочлена: ";
- cin >> kol;
- for (int i = 1; i <= kol; i++) {
- float st, ko;
- cout << "Введите через пробел коэффициент и степень для " << i << " одночлена: ";
- cin >> ko >> st;
- new_element = create(ko, st);
- where = searchplace(head, ko, st);
- if (!where)
- addlast(head, new_element);
- else
- addbefore(head, where, new_element);
- }
- cout << "Элементы занесены в список. Перейдите в пункт [2] для просмотра." << endl;
- }
- void insert_element(pm& head) {
- pm new_element, temp = head;
- int place, cur_place = 1;
- float koeff, stepen;
- cout << "Введите через пробел коэффициент и степень элемента: \n";
- cin >> koeff >> stepen;
- cout << "Введите место вставки элемента многочлена: \n";
- cin >> place;
- bool flag = false;
- while (temp != NULL) {
- if (cur_place == place) {
- new_element = create(koeff, stepen);
- addbefore(head, temp, new_element);
- flag = true;
- break;
- }
- temp = temp->next;
- cur_place++;
- }
- if (flag)
- cout << "Элемент успешно вставлен!\n";
- else {
- if (cur_place < place || place < 0)
- cout << "Указанное место не существует в многочлене!\n";
- else
- cout << "Элемент не удалось вставить!\n";
- }
- }
- void init_delete_element(pm& head) { //удаление
- float step, ko;
- cout << "Введите через пробел коэффициент и степень того элемента, который надо удалить: ";
- cin >> ko >> step;
- pm udal = search(head, ko, step);
- if (udal) {
- del(head, udal);
- cout << "Элемент успешно удален!" << endl;
- print_list(head);
- }
- else
- cout << "Такого элемента не существует!" << endl;
- }
- void clear(pm& head) {
- if (head != NULL) {
- clear(head->next);
- delete head;
- head = NULL;
- }
- }
- /* Тестовый набор данных для пункта [6], просто CTRL+C и CTRL+V
- 1
- 17
- 4 3
- 4 5
- 2 5
- 6 7
- 6 5
- 1 3
- 1 5
- 6 4
- 2 3
- 1 3
- 1 2
- 1 2
- 2 5
- 3 4
- 2 4
- 8 9
- 5 4
- */
Add Comment
Please, Sign In to add comment