Advertisement
VladimirKostovsky

Sus_c++

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