Advertisement
Margoshinka

Индивидуальная работа

Apr 14th, 2022
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <Windows.h>
  4. #include <string>
  5. using namespace std;
  6. int cou = 1;//считает шаги сортировки
  7. struct TNode {
  8.     int x;
  9.     TNode* Next;
  10. }; typedef TNode* PNode;
  11. void Del(PNode& Head, PNode&LastNode) { //функция удаляет весь список
  12.     while (Head) {
  13.         PNode q = Head;
  14.         if (Head == LastNode)LastNode = LastNode->Next;
  15.         Head = Head->Next;
  16.         delete q;
  17.     }
  18. }
  19. void DeleteNode(PNode& Head, PNode OldNode, PNode&LastNode)//функция удаляет первый элемент списка
  20. {
  21.     PNode q = Head;
  22.     if (Head == OldNode) {
  23.         Head = OldNode->Next;
  24.         LastNode = OldNode->Next;
  25.     }// удаляем первый элемент
  26.     else
  27.     {
  28.         while (q && q->Next != OldNode) // ищем элемент
  29.             q = q->Next;
  30.         if (q == NULL) return; // если не нашли, выход
  31.         if (LastNode == OldNode)LastNode = q;
  32.         q->Next = OldNode->Next;
  33.         LastNode->Next = OldNode->Next;
  34.     }
  35.     delete OldNode; // освобождаем память
  36. }
  37.  
  38.  
  39. int check2(PNode Head, int &nomer) { //функция определяет последнюю цифру в числе
  40.     int c = -1;
  41.     string s = to_string(Head->x);
  42.     if (nomer <= s.size())
  43.         c = s[s.size() - nomer] - '0';
  44.     else c = 0;
  45.     return c;
  46. }
  47.  
  48. int raz(int x) { //функция возвращает количество цифр в числе
  49.     int size;
  50.     string s = to_string(x);
  51.     if (s[0] == '-')
  52.         size = s.size() - 1;
  53.     else size = s.size();
  54.     return size;
  55. }
  56. void Show(PNode Head) { //функция выводит список
  57.     PNode q = Head;
  58.     while (q != NULL) {
  59.         cout << q->x << " ";
  60.         q = q->Next;
  61.     }return;
  62. }
  63.  
  64. void Add(int data, PNode& Head, PNode& LastNode) {//функция добаления узла в список
  65.     PNode Temp;
  66.     if (Head == NULL) {
  67.         Head = new TNode;
  68.         LastNode = Head;
  69.         Head->Next = NULL;
  70.     }
  71.     else {
  72.         Temp = new TNode;
  73.         LastNode->Next = Temp;
  74.         LastNode = Temp;
  75.         LastNode->Next = NULL;
  76.     }
  77.     LastNode->x = data;
  78.    
  79.  
  80. }
  81. int Col_vo(PNode Head) { //функция считает количество цифр в самом длинном числе
  82.     int max=0;
  83.     PNode q = Head;
  84.     while (q) {
  85.         int n = raz(q->x);
  86.         if (n > max) max = n;
  87.         q = q->Next;
  88.     }
  89.     return max;
  90. }
  91. void Sort(PNode &LastNode,PNode &Head,PNode &LastNode0, PNode &Head0, PNode &LastNode1, PNode &Head1, PNode &LastNode2, PNode &Head2, PNode &LastNode3, PNode &Head3, PNode &LastNode4, PNode &Head4, PNode &LastNode5, PNode &Head5, PNode &LastNode6, PNode &Head6, PNode &LastNode7, PNode &Head7, PNode &LastNode8, PNode &Head8, PNode &LastNode9, PNode &Head9) {
  92.     Del(Head, LastNode); //очищаем исходный список
  93.     cout << "Head0:"; Show(Head0); cout << endl;//выводим промежуточные списки
  94.     cout << "Head1:"; Show(Head1); cout << endl;
  95.     cout << "Head2:"; Show(Head2); cout << endl;
  96.     cout << "Head3:"; Show(Head3); cout << endl;
  97.     cout << "Head4:"; Show(Head4); cout << endl;
  98.     cout << "Head5:"; Show(Head5); cout << endl;
  99.     cout << "Head6:"; Show(Head6); cout << endl;
  100.     cout << "Head7:"; Show(Head7); cout << endl;
  101.     cout << "Head8:"; Show(Head8); cout << endl;
  102.     cout << "Head9:"; Show(Head9); cout << endl;
  103.     while (Head0) {
  104.         Add(Head0->x, Head, LastNode); PNode w = Head0; DeleteNode(Head0, w, LastNode0);//заносим в исходный список все списки по очереди
  105.     }
  106.     while (Head1) {
  107.         Add(Head1->x, Head, LastNode); PNode w = Head1; DeleteNode(Head1, w, LastNode1);
  108.     }
  109.     while (Head2) {
  110.         Add(Head2->x, Head, LastNode); PNode w = Head2; DeleteNode(Head2, w, LastNode2);
  111.     }
  112.     while (Head3) {
  113.         Add(Head3->x, Head, LastNode); PNode w = Head3; DeleteNode(Head3, w, LastNode3);
  114.     }
  115.     while (Head4) {
  116.         Add(Head4->x, Head, LastNode); PNode w = Head4; DeleteNode(Head4, w, LastNode4);
  117.     }
  118.     while (Head5) {
  119.         Add(Head5->x, Head, LastNode); PNode w = Head5; DeleteNode(Head5, w, LastNode5);
  120.     }
  121.     while (Head6) {
  122.         Add(Head6->x, Head, LastNode); PNode w = Head6; DeleteNode(Head6, w, LastNode6);
  123.     }
  124.     while (Head7) {
  125.         Add(Head7->x, Head, LastNode); PNode w = Head7; DeleteNode(Head7, w, LastNode7);
  126.     }
  127.     while (Head8) {
  128.         Add(Head8->x, Head, LastNode); PNode w = Head8; DeleteNode(Head8, w, LastNode8);
  129.     }
  130.     while (Head9) {
  131.         Add(Head9->x, Head, LastNode); PNode w = Head9; DeleteNode(Head9, w, LastNode9);
  132.     }
  133.     cout << "Исходный список после" << " " << cou<< " " << "шага сортировки:"; Show(Head);
  134.     cou++;
  135.     cout << endl;
  136. }
  137. int main() {
  138.     SetConsoleCP(1251);
  139.     SetConsoleOutputCP(1251);
  140.     ifstream f;
  141.     int k; int m;
  142.     f.open("input.txt");
  143.     PNode Head = NULL;
  144.     PNode LastNode = NULL;
  145.     int a;
  146.     while (f >> a) {
  147.        
  148.      Add(a, Head, LastNode); //добавляем узлы в список
  149.     }
  150.     cout << "Исходный список:" << " ";
  151.     Show(Head); // выводим исходный список
  152.     cout << endl;
  153.     k = Col_vo(Head);//считаем количество цифр в самом длинном числе
  154.    
  155.     PNode Head0=NULL, LastNode0 = NULL; // создаем 10 списков
  156.     PNode Head1=NULL, LastNode1 = NULL;
  157.     PNode Head2 = NULL, LastNode2 = NULL;
  158.     PNode Head3 = NULL, LastNode3 = NULL;
  159.     PNode Head4 = NULL, LastNode4 = NULL;
  160.     PNode Head5 = NULL, LastNode5 = NULL;
  161.     PNode Head6 = NULL, LastNode6 = NULL;
  162.     PNode Head7 = NULL, LastNode7 = NULL;
  163.     PNode Head8 = NULL, LastNode8 = NULL;
  164.     PNode Head9 = NULL, LastNode9 = NULL;
  165.    
  166.      int nomer = 1;
  167.     while (nomer <= k) {//цикличиская сортировка проходит k циклов
  168.         PNode p = Head;
  169.         while (p) {
  170.            
  171.  
  172.             int n = check2(p, nomer);//находим последнюю цифру числа
  173.             switch (n)
  174.             {
  175.             case 0: { Add(p->x, Head0, LastNode0); //добавляем вершины по типу очередь
  176.                
  177.                 break;
  178.             }
  179.             case 1: { Add(p->x, Head1, LastNode1);
  180.                
  181.                 break;
  182.             }
  183.             case 2: { Add(p->x, Head2, LastNode2);
  184.                
  185.                 break;
  186.             }
  187.             case 3: { Add(p->x, Head3, LastNode3);
  188.                
  189.                 break;
  190.             }
  191.             case 4: { Add(p->x, Head4, LastNode4);
  192.                
  193.                 break;
  194.             }
  195.             case 5: { Add(p->x, Head5, LastNode5);
  196.                
  197.                 break;
  198.             }
  199.             case 6: { Add(p->x, Head6, LastNode6);
  200.                
  201.                 break;
  202.             }
  203.             case 7: { Add(p->x, Head7, LastNode7);
  204.                
  205.                 break;
  206.             }
  207.             case 8: { Add(p->x, Head8, LastNode8);
  208.                
  209.                 break;
  210.             }
  211.             case 9: { Add(p->x, Head9, LastNode9);
  212.                
  213.                 break;
  214.             }
  215.             default: break;
  216.             }
  217.            
  218.             p = p->Next;
  219.  
  220.         }//объединяем списки
  221.         Sort(LastNode,Head, LastNode0, Head0, LastNode1, Head1, LastNode2, Head2, LastNode3, Head3, LastNode4, Head4, LastNode5, Head5, LastNode6, Head6, LastNode7, Head7, LastNode8, Head8, LastNode9, Head9);
  222.        
  223.        
  224.         nomer++;
  225.     }
  226.    
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement