Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <Windows.h>
- #include <string>
- using namespace std;
- int cou = 1;//считает шаги сортировки
- struct TNode {
- int x;
- TNode* Next;
- }; typedef TNode* PNode;
- void Del(PNode& Head, PNode&LastNode) { //функция удаляет весь список
- while (Head) {
- PNode q = Head;
- if (Head == LastNode)LastNode = LastNode->Next;
- Head = Head->Next;
- delete q;
- }
- }
- void DeleteNode(PNode& Head, PNode OldNode, PNode&LastNode)//функция удаляет первый элемент списка
- {
- PNode q = Head;
- if (Head == OldNode) {
- Head = OldNode->Next;
- LastNode = OldNode->Next;
- }// удаляем первый элемент
- else
- {
- while (q && q->Next != OldNode) // ищем элемент
- q = q->Next;
- if (q == NULL) return; // если не нашли, выход
- if (LastNode == OldNode)LastNode = q;
- q->Next = OldNode->Next;
- LastNode->Next = OldNode->Next;
- }
- delete OldNode; // освобождаем память
- }
- int check2(PNode Head, int &nomer) { //функция определяет последнюю цифру в числе
- int c = -1;
- string s = to_string(Head->x);
- if (nomer <= s.size())
- c = s[s.size() - nomer] - '0';
- else c = 0;
- return c;
- }
- int raz(int x) { //функция возвращает количество цифр в числе
- int size;
- string s = to_string(x);
- if (s[0] == '-')
- size = s.size() - 1;
- else size = s.size();
- return size;
- }
- void Show(PNode Head) { //функция выводит список
- PNode q = Head;
- while (q != NULL) {
- cout << q->x << " ";
- q = q->Next;
- }return;
- }
- void Add(int data, PNode& Head, PNode& LastNode) {//функция добаления узла в список
- PNode Temp;
- if (Head == NULL) {
- Head = new TNode;
- LastNode = Head;
- Head->Next = NULL;
- }
- else {
- Temp = new TNode;
- LastNode->Next = Temp;
- LastNode = Temp;
- LastNode->Next = NULL;
- }
- LastNode->x = data;
- }
- int Col_vo(PNode Head) { //функция считает количество цифр в самом длинном числе
- int max=0;
- PNode q = Head;
- while (q) {
- int n = raz(q->x);
- if (n > max) max = n;
- q = q->Next;
- }
- return max;
- }
- 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) {
- Del(Head, LastNode); //очищаем исходный список
- cout << "Head0:"; Show(Head0); cout << endl;//выводим промежуточные списки
- cout << "Head1:"; Show(Head1); cout << endl;
- cout << "Head2:"; Show(Head2); cout << endl;
- cout << "Head3:"; Show(Head3); cout << endl;
- cout << "Head4:"; Show(Head4); cout << endl;
- cout << "Head5:"; Show(Head5); cout << endl;
- cout << "Head6:"; Show(Head6); cout << endl;
- cout << "Head7:"; Show(Head7); cout << endl;
- cout << "Head8:"; Show(Head8); cout << endl;
- cout << "Head9:"; Show(Head9); cout << endl;
- while (Head0) {
- Add(Head0->x, Head, LastNode); PNode w = Head0; DeleteNode(Head0, w, LastNode0);//заносим в исходный список все списки по очереди
- }
- while (Head1) {
- Add(Head1->x, Head, LastNode); PNode w = Head1; DeleteNode(Head1, w, LastNode1);
- }
- while (Head2) {
- Add(Head2->x, Head, LastNode); PNode w = Head2; DeleteNode(Head2, w, LastNode2);
- }
- while (Head3) {
- Add(Head3->x, Head, LastNode); PNode w = Head3; DeleteNode(Head3, w, LastNode3);
- }
- while (Head4) {
- Add(Head4->x, Head, LastNode); PNode w = Head4; DeleteNode(Head4, w, LastNode4);
- }
- while (Head5) {
- Add(Head5->x, Head, LastNode); PNode w = Head5; DeleteNode(Head5, w, LastNode5);
- }
- while (Head6) {
- Add(Head6->x, Head, LastNode); PNode w = Head6; DeleteNode(Head6, w, LastNode6);
- }
- while (Head7) {
- Add(Head7->x, Head, LastNode); PNode w = Head7; DeleteNode(Head7, w, LastNode7);
- }
- while (Head8) {
- Add(Head8->x, Head, LastNode); PNode w = Head8; DeleteNode(Head8, w, LastNode8);
- }
- while (Head9) {
- Add(Head9->x, Head, LastNode); PNode w = Head9; DeleteNode(Head9, w, LastNode9);
- }
- cout << "Исходный список после" << " " << cou<< " " << "шага сортировки:"; Show(Head);
- cou++;
- cout << endl;
- }
- int main() {
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- ifstream f;
- int k; int m;
- f.open("input.txt");
- PNode Head = NULL;
- PNode LastNode = NULL;
- int a;
- while (f >> a) {
- Add(a, Head, LastNode); //добавляем узлы в список
- }
- cout << "Исходный список:" << " ";
- Show(Head); // выводим исходный список
- cout << endl;
- k = Col_vo(Head);//считаем количество цифр в самом длинном числе
- PNode Head0=NULL, LastNode0 = NULL; // создаем 10 списков
- PNode Head1=NULL, LastNode1 = NULL;
- PNode Head2 = NULL, LastNode2 = NULL;
- PNode Head3 = NULL, LastNode3 = NULL;
- PNode Head4 = NULL, LastNode4 = NULL;
- PNode Head5 = NULL, LastNode5 = NULL;
- PNode Head6 = NULL, LastNode6 = NULL;
- PNode Head7 = NULL, LastNode7 = NULL;
- PNode Head8 = NULL, LastNode8 = NULL;
- PNode Head9 = NULL, LastNode9 = NULL;
- int nomer = 1;
- while (nomer <= k) {//цикличиская сортировка проходит k циклов
- PNode p = Head;
- while (p) {
- int n = check2(p, nomer);//находим последнюю цифру числа
- switch (n)
- {
- case 0: { Add(p->x, Head0, LastNode0); //добавляем вершины по типу очередь
- break;
- }
- case 1: { Add(p->x, Head1, LastNode1);
- break;
- }
- case 2: { Add(p->x, Head2, LastNode2);
- break;
- }
- case 3: { Add(p->x, Head3, LastNode3);
- break;
- }
- case 4: { Add(p->x, Head4, LastNode4);
- break;
- }
- case 5: { Add(p->x, Head5, LastNode5);
- break;
- }
- case 6: { Add(p->x, Head6, LastNode6);
- break;
- }
- case 7: { Add(p->x, Head7, LastNode7);
- break;
- }
- case 8: { Add(p->x, Head8, LastNode8);
- break;
- }
- case 9: { Add(p->x, Head9, LastNode9);
- break;
- }
- default: break;
- }
- p = p->Next;
- }//объединяем списки
- Sort(LastNode,Head, LastNode0, Head0, LastNode1, Head1, LastNode2, Head2, LastNode3, Head3, LastNode4, Head4, LastNode5, Head5, LastNode6, Head6, LastNode7, Head7, LastNode8, Head8, LastNode9, Head9);
- nomer++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement