Advertisement
VladimirKostovsky

Sus_C++_2

Dec 13th, 2023
743
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6.  
  7. template <typename T>
  8. class ListNode {
  9. public:
  10.     T data;
  11.     ListNode<T>* Prev;
  12.     ListNode<T>* pNext;
  13.  
  14.     ListNode(T i, ListNode<T>* prev, ListNode<T>* nxt) : data(i), Prev(prev), pNext(nxt) {}
  15. };
  16.  
  17. template <typename T>
  18. class List {
  19. private:
  20.     ListNode<T>* first, * current, * last;
  21.     int size;
  22.     int sizeMax;
  23.  
  24.     ListNode<T>* findAt(int p);
  25.  
  26. public:
  27.     List();
  28.     ~List();
  29.  
  30.     void addAtFront(T d);
  31.     void addAtEnd(T d);
  32.     void addAt(int p, T i);
  33.     T* removeAtFront();
  34.     T* removeAtEnd();
  35.     T* removeAt(int p);
  36.     void Show();
  37.     void demo();
  38.     void sortListA();
  39.     void SaveBinaryFile();
  40.     void LoadBinaryFile();
  41.     T* getAt(int p);
  42.     T* getAtFront();
  43.     T* getAtEnd();
  44.     int getSizeMaxList();
  45.     void setSizeMaxList(int s);
  46.     int getSizeList();
  47.     void setAtStart();
  48.     void setAtEnd();
  49.     T* getNext();
  50.     T* getPrevious();
  51.  
  52.     ListNode<T>* getFirst() const {
  53.         return first;
  54.     }
  55.  
  56. };
  57.  
  58. template <typename T>
  59. List<T>::List() : first(nullptr), current(nullptr), last(nullptr), size(0), sizeMax(8) {}
  60.  
  61. template <typename T>
  62. List<T>::~List() {
  63.     ListNode<T>* temp = first;
  64.     while (temp != nullptr) {
  65.         ListNode<T>* n = temp->pNext;
  66.         delete temp;
  67.         temp = n;
  68.     }
  69. }
  70.  
  71. template <typename T>
  72. void List<T>::addAtFront(T d) {
  73.     if (size != sizeMax) {
  74.         ListNode<T>* temp = new ListNode<T>(d, nullptr, first);
  75.  
  76.         if (first != nullptr) {
  77.             first->Prev = temp;
  78.         }
  79.         first = temp;
  80.         if (last == nullptr) {
  81.             last = temp;
  82.  
  83.             size++;
  84.         }
  85.         else {
  86.             cout << "Error 404: Место в списке ограничено" << endl;
  87.         }
  88.     }
  89. }
  90.     template <typename T>
  91.     void List<T>::addAtEnd(T d) {
  92.         if (size != sizeMax) {
  93.             if (size == 0) {
  94.                 addAtFront(d);
  95.             }
  96.             else {
  97.                 ListNode<T>* temp = new ListNode<T>(d, last, nullptr);
  98.                 last->pNext = temp;
  99.                 last = temp;
  100.                 size++;
  101.             }
  102.         }
  103.         else {
  104.             cout << "Error 404: Место в списке ограничено" << endl;
  105.         }
  106.     }
  107.     template <typename T>
  108.     void List<T>::addAt(int p, T i) {
  109.         if (size != sizeMax) {
  110.             if (p == 0) {
  111.                 addAtFront(i);
  112.             }
  113.             else if (p == size) {
  114.                 addAtEnd(i);
  115.             }
  116.             else {
  117.                 ListNode<T>* temp = findAt(p);
  118.                 if (temp != nullptr) {
  119.                     ListNode<T>* l = new ListNode<T>(i, temp->Prev, temp);
  120.                     temp->Prev->pNext = l;
  121.                     temp->Prev = l;
  122.                     size++;
  123.                 }
  124.             }
  125.         }
  126.         else {
  127.             cout << "Error 404: Место в списке ограничено" << endl;
  128.         }
  129.     }
  130.  
  131.     template <typename T>
  132.     T* List<T>::removeAtFront() {
  133.         if (size == 0) {
  134.             cout << "No item to be removed at front of list" << endl;
  135.             return nullptr;
  136.         }
  137.  
  138.         T temp_data = first->data;
  139.         ListNode<T>* temp = first;
  140.  
  141.         if (first->pNext != nullptr) {
  142.             first->pNext->Prev = nullptr;
  143.         }
  144.         first = first->pNext;
  145.         size--;
  146.  
  147.         if (size == 0) {
  148.             last = nullptr;
  149.         }
  150.         delete temp;
  151.         return new T(temp_data);
  152.     }
  153.  
  154.     template <typename T>
  155.     T* List<T>::removeAtEnd() {
  156.         if (size == 0) {
  157.             cout << "No item to be removed at end of list" << endl;
  158.             return nullptr;
  159.         }
  160.  
  161.         T temp_data = last->data;
  162.         ListNode<T>* temp = last;
  163.  
  164.         if (last->Prev != nullptr) {
  165.             last->Prev->pNext = nullptr;
  166.         }
  167.         last = last->Prev;
  168.         size--;
  169.  
  170.         if (size == 0) {
  171.             first = nullptr;
  172.         }
  173.         delete temp;
  174.         return new T(temp_data);
  175.     }
  176.  
  177.     template <typename T>
  178.     T* List<T>::removeAt(int p) {
  179.         if (p < 0 || p >= size) {
  180.             cout << "No item to be removed at list position " << p << endl;
  181.             return nullptr;
  182.         }
  183.  
  184.         if (p == 0) {
  185.             return removeAtFront();
  186.         }
  187.  
  188.         if (p == size - 1) {
  189.             return removeAtEnd();
  190.         }
  191.  
  192.         ListNode<T>* temp = findAt(p);
  193.         T temp_data = temp->data;
  194.  
  195.         temp->Prev->pNext = temp->pNext;
  196.         temp->pNext->Prev = temp->Prev;
  197.         size--;
  198.  
  199.         delete temp;
  200.         return new T(temp_data);
  201.     }
  202.  
  203.     template <typename T>
  204.     void List<T>::Show() {
  205.         ListNode<T>* temp = first;
  206.  
  207.         while (temp != nullptr) {
  208.             cout << temp->data << " - ";
  209.             temp = temp->pNext;
  210.         }
  211.  
  212.         cout << "End" << endl;
  213.     }
  214.  
  215.     template <typename T>
  216.     void List<T>::demo() {
  217.         ListNode<T>* temp = last;
  218.  
  219.         while (temp != nullptr) {
  220.             cout << temp->data << " - ";
  221.             temp = temp->Prev;
  222.         }
  223.  
  224.         cout << "End" << endl;
  225.     }
  226.  
  227.     template <typename T>
  228.     ListNode<T>* List<T>::findAt(int p) {
  229.         ListNode<T>* temp = first;
  230.         for (int i = 0; i < p && temp != nullptr; i++) {
  231.             temp = temp->pNext;
  232.         }
  233.         return temp;
  234.     }
  235.  
  236.     template <typename T>
  237.     void List<T>::sortListA() {
  238.         ListNode <T>* t, * m, * a, * b;
  239.         if (first == nullptr) {
  240.             return;
  241.         }
  242.  
  243.         for (bool go = true; go;) {
  244.             go = false;
  245.             a = t = first;
  246.             b = first->pNext;
  247.  
  248.             while (b != nullptr) {
  249.                 if (a->data > b->data) {
  250.                     if (t == a) {
  251.                         first = b;
  252.                     }
  253.                     else
  254.                         t->pNext = b;
  255.  
  256.                     a->pNext = b->pNext;
  257.                     b->pNext = a;
  258.  
  259.                     m = a, a = b, b = m;
  260.                     go = true;
  261.                 }
  262.                 t = a;
  263.                 a = a->pNext;
  264.                 b = b->pNext;
  265.             }
  266.         }
  267.     }
  268.  
  269.    template <typename T>
  270.     void List<T>::SaveBinaryFile() {
  271.         std::ofstream fileOut("file.dat", std::ios::binary);
  272.  
  273.         if (!fileOut) {
  274.             std::cout << "Ошибка открытия файла" << std::endl;
  275.         }
  276.         else {
  277.             ListNode<T>* a = first;
  278.             while (a != nullptr) {
  279.                 std::cout << ">> " << a->data << std::endl;
  280.                 fileOut.write(reinterpret_cast<char*>(&a->data), sizeof(T));
  281.                 a = a->pNext;
  282.             }
  283.  
  284.             fileOut.close();
  285.         }
  286.     }
  287.  
  288.     template <typename T>
  289.     void List<T>::LoadBinaryFile() {
  290.         std::ifstream fileIn("file.dat", std::ios::binary);
  291.  
  292.         if (!fileIn) {
  293.             std::cout << "Ошибка открытия файла" << std::endl;
  294.         }
  295.         else {
  296.             ListNode<T>* a = first;
  297.             int tempSize = 0;
  298.  
  299.             while (a != nullptr) {
  300.                 fileIn.read(reinterpret_cast<char*>(&a->data), sizeof(T));
  301.                 std::cout << ">> " << a->data << std::endl;
  302.                 a = a->pNext;
  303.                 tempSize++;
  304.             }
  305.  
  306.             size = tempSize;
  307.             std::cout << "Размер списка успешно обновлен" << std::endl;
  308.  
  309.             fileIn.close();
  310.         }
  311.     }
  312.    
  313.     template <typename T>
  314.     T* List<T>::getAt(int p) {
  315.         ListNode<T>* temp = findAt(p);
  316.         return (temp != nullptr) ? &temp->data : nullptr;
  317.     }
  318.  
  319.     template <typename T>
  320.     T* List<T>::getAtFront() {
  321.         return (first != nullptr) ? &first->data : nullptr;
  322.     }
  323.  
  324.     template <typename T>
  325.     T* List<T>::getAtEnd() {
  326.         return (last != nullptr) ? &last->data : nullptr;
  327.     }
  328.  
  329.     template <typename T>
  330.     int List<T>::getSizeMaxList() {
  331.         return this->sizeMax;
  332.     }
  333.  
  334.     template <typename T>
  335.     void List<T>::setSizeMaxList(int s) {
  336.         this->sizeMax = s;
  337.     }
  338.  
  339.     template <typename T>
  340.     int List<T>::getSizeList() {
  341.         return this->size;
  342.     }
  343.  
  344.     template <typename T>
  345.     void List<T>::setAtStart() {
  346.         current = first;
  347.     }
  348.  
  349.     template <typename T>
  350.     void List<T>::setAtEnd() {
  351.         current = last;
  352.     }
  353.  
  354.     template <typename T>
  355.     T* List<T>::getNext() {
  356.         if (current != nullptr) {
  357.             T temp_data = current->data;
  358.             current = current->pNext;
  359.             return new T(temp_data);
  360.         }
  361.         return nullptr;
  362.     }
  363.  
  364.     template <typename T>
  365.     T* List<T>::getPrevious() {
  366.         if (current != nullptr) {
  367.             T temp_data = current->data;
  368.             current = current->Prev;
  369.             return new T(temp_data);
  370.         }
  371.         return nullptr;
  372.     }
  373.  
  374.     template <typename T>
  375.     class Array {
  376.     private:
  377.         List<T>* arr;
  378.         int arrsize;
  379.         int arrsizeMax;
  380.  
  381.     public:
  382.         Array();
  383.         ~Array();
  384.  
  385.         int getSize();
  386.         int getSizeMax();
  387.         void setSize(int s);
  388.         void setSizeMax(int s);
  389.         void Push(T value);
  390.         void ClearArr();
  391.         void removeEndList();
  392.         void Show();
  393.         void SaveFile();
  394.         void LoadFile();
  395.         void SaveBinaryFile();
  396.         void LoadBinaryFile();
  397.  
  398.  
  399.     };
  400.  
  401.     template <typename T>
  402.     Array<T>::Array() : arrsize(0), arrsizeMax(3), arr(new List<T>[arrsizeMax]) {}
  403.  
  404.     template <typename T>
  405.     Array<T>::~Array() {
  406.         delete[] arr;
  407.     }
  408.  
  409.     template <typename T>
  410.     int Array<T>::getSize() {
  411.         return this->arrsize;
  412.     }
  413.  
  414.     template <typename T>
  415.     int Array<T>::getSizeMax() {
  416.         return this->arrsizeMax;
  417.     }
  418.  
  419.     template <typename T>
  420.     void Array<T>::setSize(int s) {
  421.         this->arrsize = s;
  422.     }
  423.  
  424.     template <typename T>
  425.     void Array<T>::setSizeMax(int s) {
  426.         if (s < arrsize) {
  427.             cout << "Max не может быть меньше текущего количества" << endl;
  428.         }
  429.         else {
  430.             this->arrsizeMax = s;
  431.         }
  432.     }
  433.  
  434.     template <typename T>
  435.     void Array<T>::Push(T value) {
  436.         if (arrsize == arrsizeMax) {
  437.             cout << "Массив полон" << endl;
  438.         }
  439.         else {
  440.             if (this->arr[arrsize].getSizeList() == this->arr[arrsize].getSizeMaxList()) {
  441.                 arrsize++;
  442.                 this->arr[arrsize].addAtFront(value);
  443.             }
  444.             else {
  445.                 this->arr[arrsize].addAtEnd(value);
  446.             }
  447.         }
  448.     }
  449.  
  450.     template <typename T>
  451.     void Array<T>::removeEndList() {
  452.         if (arrsize > 0) {
  453.             arr[arrsize].removeAtEnd();
  454.             arrsize--;
  455.         }
  456.     }
  457.  
  458.     template <typename T>
  459.     void Array<T>::ClearArr() {
  460.         if (arrsize == 0) {
  461.             arr[0].~List();
  462.         }
  463.         else {
  464.             arr[arrsize].~List();
  465.             arrsize--;
  466.         }
  467.     }
  468.  
  469.     template <typename T>
  470.     void Array<T>::Show() {
  471.         for (int i = 0; i <= arrsize; i++) {
  472.             cout << "Array " << i << ": ";
  473.             arr[i].Show();
  474.         }
  475.     }
  476.  
  477.     template <typename T>
  478.     void Array<T>::SaveFile() {
  479.         ofstream fileOut("array_file.dat");
  480.  
  481.         if (!fileOut) {
  482.             cout << "Ошибка открытия файла";
  483.         }
  484.         else {
  485.             for (int i = 0; i <= arrsize; i++) {
  486.                 ListNode<T>* a = arr[i].getAtFront();
  487.                 while (a != nullptr) {
  488.                     cout << ">> " << a->data << endl;
  489.                     fileOut << a->data << " ";
  490.                     a = a->pNext;
  491.                 }
  492.             }
  493.             fileOut.close();
  494.         }
  495.     }
  496.  
  497.     template <typename T>
  498.     void Array<T>::LoadFile() {
  499.         ifstream fileIn("array_file.dat");
  500.  
  501.         if (!fileIn) {
  502.             cout << "Ошибка открытия файла";
  503.         }
  504.         else {
  505.             for (int i = 0; i <= arrsize; i++) {
  506.                 ListNode<T>* a = arr[i].getAtFront();
  507.                 int tempSize = 0;
  508.  
  509.                 while (a != nullptr) {
  510.                     fileIn >> a->data;
  511.                     cout << ">> " << a->data << endl;
  512.                     a = a->pNext;
  513.                     tempSize++;
  514.                 }
  515.  
  516.                 arr[i].setSize(tempSize);
  517.             }
  518.  
  519.             fileIn.close();
  520.         }
  521.     }
  522.    /* template <typename T>
  523.     void List<T>::SaveBinaryFile() {
  524.         std::ofstream fileOut("file.dat", std::ios::binary);
  525.  
  526.         if (!fileOut) {
  527.             std::cout << "Ошибка открытия файла" << std::endl;
  528.         }
  529.         else {
  530.             ListNode<T>* a = first;
  531.             while (a != nullptr) {
  532.                 std::cout << ">> " << a->data << std::endl;
  533.                 fileOut.write(reinterpret_cast<char*>(&a->data), sizeof(T));
  534.                 a = a->pNext;
  535.             }
  536.  
  537.             fileOut.close();
  538.         }
  539.     }
  540.  
  541.     template <typename T>
  542.     void List<T>::LoadBinaryFile() {
  543.         std::ifstream fileIn("file.dat", std::ios::binary);
  544.  
  545.         if (!fileIn) {
  546.             std::cout << "Ошибка открытия файла" << std::endl;
  547.         }
  548.         else {
  549.             ListNode<T>* a = first;
  550.             int tempSize = 0;
  551.  
  552.             while (a != nullptr) {
  553.                 fileIn.read(reinterpret_cast<char*>(&a->data), sizeof(T));
  554.                 std::cout << ">> " << a->data << std::endl;
  555.                 a = a->pNext;
  556.                 tempSize++;
  557.             }
  558.  
  559.             size = tempSize;
  560.             std::cout << "Размер списка успешно обновлен" << std::endl;
  561.  
  562.             fileIn.close();
  563.         }
  564.     }
  565.     */
  566.     template <typename T>
  567.     void Test(T value) {
  568.         List<T> myList;
  569.         myList.addAtEnd(value);
  570.         myList.Show();
  571.     }  
  572.  
  573.     template <typename T>
  574.     void Menu2() {
  575.         cout << "1. Тестировать с int\n";
  576.         cout << "2. Тестировать с char\n";
  577.         cout << "3. Тестировать с float\n";
  578.         cout << "4. Тестировать с double\n";
  579.     }
  580.  
  581.     int main() {
  582.         Array<int> intArray; // Используйте свой шаблонный класс Array с типом int
  583.  
  584.         int i = 0;
  585.         char c = 'c';
  586.         float f = 0;
  587.         double d = 0;
  588.         char veb;
  589.  
  590.         for (;;) {
  591.             cout << "Выбор работы с шаблонами" << endl;
  592.             Menu2<int>();  // Вызовем Menu2 с типом int. Вы можете изменить тип по своему усмотрению.
  593.             cout << ">>";
  594.             cin >> veb;
  595.  
  596.  
  597.             if (veb == 1) {
  598.                 Test(i);
  599.                 system("pause");
  600.                 return 0;
  601.             }
  602.             else if (veb == 2) {
  603.                 Test(c);
  604.                 system("pause");
  605.                 return 0;
  606.             }
  607.             else if (veb == 3) {
  608.                 Test(f);
  609.                 system("pause");
  610.                 return 0;
  611.             }
  612.             else if (veb == 4) {
  613.                 Test(d);
  614.                 system("pause");
  615.                 return 0;
  616.             }
  617.             else {
  618.                 std::cout << "Ошибка" << std::endl;
  619.             }
  620.         }
  621.  
  622.         switch (veb) {
  623.         case 'a':
  624.             system("cls");
  625.             int valA;
  626.             cout << "Введите элемент" << endl;
  627.             cout << ">>";
  628.             cin >> valA;
  629.             intArray.Push(valA);
  630.             break;
  631.         case 'w':
  632.             system("cls");
  633.             intArray.Show();
  634.             break;
  635.         case 'b':
  636.             system("cls");
  637.             cout << "Сколько хотите ввести элементов?" << endl;
  638.             int numB;
  639.             cout << ">>";
  640.             cin >> numB;
  641.             int valB;
  642.             cout << "Ввод:" << endl;
  643.             for (int t = 0; t < numB; t++) {
  644.                 cout << ">>";
  645.                 cin >> valB;
  646.                 intArray.Push(valB);
  647.             }
  648.             break;
  649.         case 'v':
  650.             system("cls");
  651.             intArray.removeEndList();
  652.             cout << "Удален последний элемент" << endl;
  653.             break;
  654.         case 'c':
  655.             system("cls");
  656.             cout << "Очистка последнего элемента" << endl;
  657.             intArray.ClearArr();
  658.             break;
  659.         case 'x':
  660.             system("cls");
  661.             intArray.SaveBinaryFile();
  662.             break;
  663.         case 'z':
  664.             system("cls");
  665.             intArray.LoadBinaryFile();
  666.             break;
  667.         case 'r':
  668.             system("cls");
  669.             system("pause");
  670.             return 0;
  671.         case 'e':
  672.             system("cls");
  673.             break;
  674.         default:
  675.             cout << "Неверный выбор" << endl;
  676.             break;
  677.         }
  678.         return 0;
  679.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement