Advertisement
igoryanchik

list

Apr 25th, 2023 (edited)
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <typeinfo>
  3. #include <fstream>
  4. #include <string>
  5. #include <random>
  6. #include <ctime>
  7. using namespace std;
  8.  
  9. class Exception : public std::exception
  10. {
  11. protected:
  12.     char* str;
  13. public:
  14.  
  15.     Exception(const char* s)
  16.     {
  17.         if (str != nullptr)
  18.         {
  19.             str = new char[strlen(s) + 1];
  20.             if (str != 0)
  21.             {
  22.                 strcpy_s(str, strlen(s) + 1, s);
  23.             }
  24.         }
  25.     }
  26.  
  27.     Exception(const Exception& V)
  28.     {
  29.         if (V.str != nullptr)
  30.         {
  31.             str = new char[strlen(V.str) + 1];
  32.             if (str != 0)
  33.             {
  34.                 strcpy_s(str, strlen(V.str) + 1, V.str);
  35.             }
  36.         }
  37.     }
  38.  
  39.     ~Exception()
  40.     {
  41.         if (str != nullptr)
  42.             delete[] str;
  43.     }
  44.  
  45.     virtual void print()
  46.     {
  47.         cout << "Exception:" <<  str;
  48.     }
  49. };
  50.  
  51. class WrongSize : public Exception
  52. {
  53. protected:
  54.     int count;
  55.     int index;
  56. public:
  57.     WrongSize(int count, int index) : Exception("Going beyond the boundaries of  the object")
  58.     {
  59.         this->count = count;
  60.         this->index = index;
  61.     }
  62.  
  63.     void print() const
  64.     {
  65.         cout << "Exception:" << str << "\nValid indexes lie in interval from 0 to " << count << "\nYou tried get:" << index << '\n';
  66.     }
  67. };
  68.  
  69. class MemoryAllocationError : public Exception
  70. {
  71. public:
  72.     MemoryAllocationError() : Exception("MemoryAllocationError") { }
  73.  
  74.     void print() const
  75.     {
  76.         cout << "Exception:" << str << '\n';
  77.     }
  78. };
  79.  
  80. template <class T>
  81. class LinkedList;
  82. class Stadium;
  83.  
  84.  
  85. template <class T>
  86. class Node
  87. {
  88. public:
  89.  
  90.     Node* next;
  91.     Node* prev;
  92.     T data;
  93.  
  94.     Node(const T _data = T(), Node* _prev = nullptr, Node* _next = nullptr)
  95.     {
  96.         data = _data;
  97.         next = _next;
  98.         prev = _prev;
  99.     }
  100.  
  101.     Node(const Node<T>& V)
  102.     {
  103.         next = V.next;
  104.         prev = V.prev;
  105.         data = V.data;
  106.     }
  107.  
  108.     template <class T>
  109.     friend class LinkedList;
  110.  
  111.     template <class T>
  112.     friend ostream& operator << (ostream& out, Node<T>& V);
  113.  
  114.     template <class T>
  115.     friend istream& operator >>(istream& in, Node<T>& V);
  116. };
  117.  
  118. template <class T>
  119. ostream& operator << (ostream& out, Node<T>& V)
  120. {
  121.     out << V.data;
  122.     return out;
  123. }
  124.  
  125. template <class T>
  126. istream& operator >>(istream& in, Node<T>& V)
  127. {
  128.     in >> V.data;
  129.     return in;
  130. }
  131.  
  132. template <class T>
  133. class LinkedList
  134. {
  135. private:
  136.  
  137.     Node<T>* head;
  138.     Node<T>* tail;
  139.     int count;
  140. public:
  141.  
  142.     //конструктор по умолчанию
  143.     LinkedList<T>()
  144.     {
  145.         head = nullptr;
  146.         tail = nullptr;
  147.         count = 0;
  148.     }
  149.  
  150.     //конструктор принимающий узел
  151.     LinkedList<T>(const T data)
  152.     {
  153.         count = 1;
  154.         this->head = new Node<T>(data);
  155.         if (head == 0) throw MemoryAllocationError();
  156.         this->tail = this->head;
  157.     }
  158.  
  159.     //конструтор принимающий ifstream
  160.     LinkedList(ifstream& in)
  161.     {
  162.         if (in)
  163.         {
  164.             int size;
  165.             in >> size;
  166.  
  167.             for (int i = 0; i < size; ++i)
  168.             {
  169.                 T x;
  170.                 in >> x;
  171.                 push_back(x);
  172.             }
  173.         }
  174.     }
  175.  
  176.     LinkedList(const LinkedList<T>& list)
  177.     {
  178.         count = 0;
  179.         Node<T>* temp = list.head;
  180.         for (temp; temp != nullptr; temp = temp->next)
  181.         {
  182.             push_back(temp->data);
  183.         }
  184.     }
  185.  
  186.     LinkedList& operator = (const LinkedList<T>& list)
  187.     {
  188.         if (this == &list) return *this;
  189.  
  190.         count = 0;
  191.         Node<T>* temp = list.head;
  192.  
  193.         for (temp; temp != nullptr; temp = temp->next)
  194.         {
  195.             push_back(temp->data);
  196.         }
  197.         return *this;
  198.     }
  199.  
  200.     //метод считывания списка из файла
  201.     LinkedList<T>& load(ifstream& in)
  202.     {
  203.         if (in)
  204.         {
  205.             count = 0;
  206.             int size;
  207.             in >> size;
  208.  
  209.             for (int i = 0; i < size; ++i)
  210.             {
  211.                 T x;
  212.                 in >> x;
  213.                 push_back(x);
  214.             }
  215.         }
  216.         return *this;
  217.     }
  218.  
  219.     //метод записи списка в файл
  220.     ofstream save(ofstream& out) const
  221.     {
  222.         if (out)
  223.         {
  224.             out << count << '\n';
  225.             for (Node<T>* temp = head; temp != nullptr; temp = temp->next)
  226.             {
  227.                 out << temp->data << " ";
  228.             }
  229.         }
  230.         return out;
  231.     }
  232.  
  233.     //геттер длины списка
  234.     int lenght()
  235.     {
  236.         return count;
  237.     }
  238.  
  239.     //геттер головы списка
  240.     Node<T>* Head()
  241.     {
  242.         return head;
  243.     }
  244.  
  245.     //геттер хвоста списка
  246.     Node<T>* Tail()
  247.     {
  248.         return tail;
  249.     }
  250.  
  251.     //добавление элемета в конец списка
  252.     void push_back(const T& data)
  253.     {
  254.         if (head == nullptr)
  255.         {
  256.             head = new Node<T>(data);
  257.             if (head == 0) throw MemoryAllocationError();
  258.             tail = head;
  259.         }
  260.         else
  261.         {
  262.             tail->next = new Node<T>(data, tail);
  263.             if (tail->next == 0) throw MemoryAllocationError();
  264.             tail = tail->next;
  265.         }
  266.         count++;
  267.     }
  268.  
  269.     //добавление элемета в начало списка
  270.     void push_front(const T& data)
  271.     {
  272.         if (head == nullptr)
  273.         {
  274.             head = new Node<T>(data);
  275.             if (head == 0) throw MemoryAllocationError();
  276.             tail = head;
  277.         }
  278.         else
  279.         {
  280.             head->prev = new Node<T>(data, nullptr, head);
  281.             if (head->prev == 0) throw MemoryAllocationError();
  282.             head = head->prev;
  283.         }
  284.         count++;
  285.     }
  286.  
  287.     //вставка после i-го индекса
  288.     void InsertAfter(const T& data, int index)
  289.     {
  290.         if (index <= 0 && index > count) throw WrongSize(count, index);
  291.         else if (index == count || head == nullptr)
  292.         {
  293.             push_back(data);
  294.             return;
  295.         }
  296.         else
  297.         {
  298.             Node<T>* temp = head;
  299.             for (int i = 0; i < index && temp != nullptr; ++i, temp = temp->next);
  300.             temp->next = new Node<T>(data, temp, temp->next);
  301.  
  302.             if (temp->next == 0) throw MemoryAllocationError();
  303.         }
  304.         count++;
  305.     }
  306.  
  307.     //вставка до i-го индекса
  308.     void InsertBefore(const T& data, int index)
  309.     {
  310.         if (index <= 0 && index) throw WrongSize(count, index);
  311.         else if (index == 0 || head == nullptr)
  312.         {
  313.             push_front(data);
  314.             return;
  315.         }
  316.         else
  317.         {
  318.             Node<T>* temp = head;
  319.             for (int i = 0; i < index && temp != nullptr; ++i, temp = temp->next);
  320.             temp->prev = new Node<T>(data, temp->prev, temp);
  321.  
  322.             if (temp->prev == 0) throw MemoryAllocationError();
  323.         }
  324.     }
  325.  
  326.     //удаление элемента с конца
  327.     void pop_back()
  328.     {
  329.         if (head == nullptr)
  330.         {
  331.             cout << "List is empty";
  332.             return;
  333.         }
  334.         else
  335.         {
  336.             tail = tail->prev;
  337.             delete tail->next;
  338.             tail->next = nullptr;
  339.         }
  340.         count--;
  341.     }
  342.  
  343.     //удаление элемента с начала
  344.     void pop_front()
  345.     {
  346.         if (head == nullptr)
  347.         {
  348.             cout << "List is empty";
  349.             return;
  350.         }
  351.         else
  352.         {
  353.             head = head->next;
  354.             delete head->prev;
  355.             head->prev = nullptr;
  356.         }
  357.         count--;
  358.     }
  359.  
  360.     T operator()(int index)
  361.     {
  362.         if (index < 0 || index > count) throw WrongSize(count, index);
  363.         else
  364.         {
  365.             Node<T> temp = head;
  366.             for (int i = 0; i < index, temp != nullptr; ++i, temp->next);
  367.             return temp->data;
  368.         }
  369.     }
  370.  
  371.     //удаление i-го элемента
  372.     void remove(const int index)
  373.     {
  374.         if (head == nullptr)
  375.         {
  376.             cout << "List is empty";
  377.             return;
  378.         }
  379.         if (index < 0 || index > count) throw WrongSize(count, index);
  380.         else if (index == 0)
  381.         {
  382.             pop_front();
  383.             return;
  384.         }
  385.         else if (index == count - 1)
  386.         {
  387.             pop_back();
  388.             return;
  389.         }
  390.         else
  391.         {
  392.             Node<T>* temp = head;
  393.             for (int i = 0; i != index; ++i, temp = temp->next);
  394.  
  395.             temp->prev->next = temp->next;
  396.             temp->next->prev = temp->prev;
  397.             delete temp;
  398.         }
  399.         count--;
  400.     }
  401.  
  402.     int find(T& data)
  403.     {
  404.         if (head != nullptr) // ????
  405.         {
  406.             Node<T>* temp = head;
  407.             for (int i = 0; i < count && temp != nullptr; ++i, temp = temp->next)
  408.             {
  409.                 if (temp->data == data)
  410.                 {
  411.                     return i;
  412.                 }
  413.             }
  414.             return -1;
  415.         }
  416.     }
  417.  
  418.     int find(const char* data)
  419.     {
  420.         if (head != nullptr) // ????
  421.         {
  422.             Node<T>* temp = head;
  423.             for (int i = 0; i < count && temp != nullptr; ++i, temp = temp->next)
  424.             {
  425.                 if (temp->data == data)
  426.                 {
  427.                     return i;
  428.                 }
  429.             }
  430.             return -1;
  431.         }
  432.     }
  433.  
  434.     LinkedList<T> filter(T& data)
  435.     {
  436.         LinkedList<T> rez;
  437.         Node<T>* temp = head;
  438.  
  439.         for (int i = 0; i < count, temp != nullptr; ++i, temp = temp->next)
  440.         {
  441.             if ((temp->data) <= data) rez.push_back(temp->data);
  442.         }
  443.  
  444.         return rez;
  445.     }
  446.  
  447.     LinkedList<T> filter(const int& data)
  448.     {
  449.         LinkedList<T> rez;
  450.         Node<T>* temp = head;
  451.  
  452.         for (int i = 0; i < count, temp != nullptr; ++i, temp = temp->next)
  453.         {
  454.             if ((temp->data) <= data) rez.push_back(temp->data);
  455.         }
  456.  
  457.         return rez;
  458.     }
  459.  
  460.  
  461.  
  462.     void print() const
  463.     {
  464.         Node<T>* temp = head;
  465.         while (temp != nullptr)
  466.         {
  467.             cout << temp->data << " ";
  468.             temp = temp->next;
  469.         }
  470.         cout << '\n';
  471.     }
  472.  
  473.     ~LinkedList()
  474.     {
  475.         for (int i = 0; i < count - 1; ++i)
  476.         {
  477.             pop_back();
  478.         }
  479.         delete head;
  480.         delete tail;
  481.     }
  482.  
  483.     template <class T>
  484.     friend ostream& operator <<(ostream& out, LinkedList<T>& V);
  485.  
  486.     template <class T>
  487.     friend istream& operator >>(istream& in, LinkedList<T>& V);
  488. };
  489.  
  490. template <class T>
  491. ostream& operator <<(ostream& out, LinkedList<T>& V)
  492. {
  493.     if (typeid(out).name() == typeid(ofstream).name())
  494.     {
  495.         out << V.count << '\n';
  496.     }
  497.  
  498.     for (Node<T>* temp = V.head; temp != nullptr; temp = temp->next)
  499.     {
  500.         out << temp->data << " ";
  501.     }
  502.  
  503.     return out;
  504. }
  505.  
  506. template <class T>
  507. istream& operator >> (istream& in, LinkedList<T>& V)
  508. {
  509.     in >> V.count;
  510.  
  511.     for (int i = 0; i < V.count; ++i)
  512.     {
  513.         T x;
  514.         in >> x;
  515.         V.push_back(x);
  516.     }
  517.  
  518.     return in;
  519. }
  520.  
  521. class Stadium
  522. {
  523. private:
  524.     string titel;
  525.     string sport;
  526.     int capacity;
  527.     int year;
  528.     int count;
  529. public:
  530.  
  531.     //конструкторы
  532.     Stadium(string _titel = " ", string _sport = " ", int _capacity = 10000, int _year = 2000, int _count = 1)
  533.     {
  534.         titel = _titel;
  535.         sport = _sport;
  536.         capacity = _capacity;
  537.         year = _year;
  538.         count = _count;
  539.     }
  540.  
  541.     Stadium(const Stadium& S)
  542.     {
  543.         titel = S.titel;
  544.         sport = S.sport;
  545.         capacity = S.capacity;
  546.         year = S.year;
  547.         count = S.count;
  548.     }
  549.  
  550.     //опрератор =
  551.     Stadium& operator = (const Stadium& S)
  552.     {
  553.         if (this == &S) return *this;;
  554.  
  555.         titel = S.titel;
  556.         sport = S.sport;
  557.         capacity = S.capacity;
  558.         year = S.year;
  559.         count = S.count;
  560.  
  561.         return *this;
  562.     }
  563.  
  564.     //геттеры
  565.     string titel_() { return titel; }
  566.     string sport_() { return sport; }
  567.     int Capacity() { return capacity; }
  568.     int Year() { return year; }
  569.     int Count() { return count; }
  570.  
  571.     //сеттеры
  572.     void SetTitel(string& _titel) { titel = _titel; }
  573.     void SetSport(string& _sport) { sport = _sport; }
  574.     void SetCapacity(int _capacity) { capacity = _capacity; }
  575.     void SetYear(int _year) { year = _year; }
  576.     void SetCount(int _count) { count = _count; }
  577.  
  578.     friend bool operator >=(Stadium& s1, Stadium& s2);
  579.     friend bool operator <=(Stadium& s1, Stadium& s2);
  580.     friend bool operator >=(Stadium& s1, const int& s2);
  581.     friend bool operator <=(Stadium& s1, const int& s2);
  582.     friend bool operator == (Stadium& s1, Stadium& s2);
  583.     friend bool operator == (Stadium& s, const char* s2);
  584.     friend ostream& operator << (ostream& out, Stadium& s);
  585.     friend istream& operator >> (istream& in, Stadium& s);
  586. };
  587.  
  588. bool operator >=(Stadium& s1, const int& s2)
  589. {
  590.     return s1.year >= s2;
  591. }
  592.  
  593. bool operator <=(Stadium& s1, const int& s2)
  594. {
  595.     return s1.year <= s2;
  596. }
  597.  
  598. bool operator >=(Stadium& s1, Stadium& s2)
  599. {
  600.     return (s1.year >= s2.year);
  601. }
  602.  
  603. bool operator <=(Stadium& s1, Stadium& s2)
  604. {
  605.     return (s1.year <= s2.year);
  606. }
  607.  
  608. bool operator == (Stadium& s1, Stadium& s2)
  609. {
  610.     return (s1.titel == s2.titel);
  611. }
  612.  
  613. bool operator == (Stadium& s, const char* s2)
  614. {
  615.     return s.titel == s2;
  616. }
  617.  
  618.  
  619. ostream& operator << (ostream& out, Stadium& s)
  620. {
  621.     if (typeid(out).name() == typeid(ofstream).name())
  622.     {
  623.         out << s.titel << " " << s.sport << " " << s.capacity << " " << s.year << " " << s.count;
  624.     }
  625.     else
  626.     {
  627.         out << "Stadium title: " << s.titel << '\n'
  628.             << "Types of sport: " << s.sport << '\n'
  629.             << "Capacity: " << s.capacity << '\n'
  630.             << "Yeat of build: " << s.year << '\n'
  631.             << "Number of arenas: " << s.count << '\n';
  632.     }
  633.     return out;
  634. }
  635.  
  636. istream& operator >> (istream& in, Stadium& s)
  637. {
  638.     in >> s.titel >> s.sport >> s.capacity >> s.year >> s.count;
  639.     return in;
  640. }
  641.  
  642.  
  643. string titel[] = { "Sokker", "NationalStadium", " Australia" , "ShahALm" , "GuangDong", "Luzhniki", "Nissan", "Mercedes", "Olimpic", "Dragan", "NoName" };
  644. string sport[] = { "football", "basketball", "volleyball", "tennis", "running", "jumping", "skiing", "cucling", "boxing", "swimming", "hockey", "allWinter", "allSummer", "all" };
  645. int main()
  646. {
  647.     srand(time(NULL));
  648.  
  649.     LinkedList<int> A;
  650.     for (int i = 1; i <= 10; ++i)
  651.     {
  652.         A.push_front((i * 2 * 3));
  653.     }
  654.     A.print();
  655.  
  656.  
  657.     ofstream fout1("out.txt");
  658.     if (fout1)
  659.     {
  660.         fout1 << A;
  661.         fout1.close();
  662.     }
  663.  
  664.     ifstream fin1("out.txt");
  665.     if (fin1)
  666.     {
  667.         LinkedList<int> B;
  668.         B.load(fin1);
  669.         cout << B;
  670.         fin1.close();
  671.     }
  672.  
  673.     LinkedList <Stadium> stadium;
  674.     Stadium st;
  675.  
  676.     for (int i = 0; i < 9; ++i)
  677.     {
  678.         Stadium temp(titel[i], sport[i + 1], rand() % 10000 + 10000, 1900 + rand() % 123, rand() % 5);
  679.         if (i == 1)
  680.         {
  681.             st = temp;
  682.         }
  683.         stadium.push_back(temp);
  684.     }
  685.  
  686.     ofstream fout("aa.txt");
  687.     if (fout)
  688.     {
  689.         fout << stadium;
  690.         fout.close();
  691.     }
  692.  
  693.     ifstream fin("aa.txt");
  694.     LinkedList <Stadium> list;
  695.     if (fin)
  696.     {
  697.         list.load(fin);
  698.         //cout << list;
  699.         fin.close();
  700.     }
  701.  
  702.     cout << list.find("ShahALm") << '\n';
  703.  
  704.  
  705.     LinkedList<Stadium> listok = stadium.filter(2000);
  706.  
  707.     ofstream out("testik.txt");
  708.     if (out)
  709.     {
  710.         out << listok;
  711.         out.close();
  712.     }
  713.  
  714.     ofstream out1("test1.txt");
  715.     if (out1)
  716.     {
  717.         out1 << stadium;
  718.         out1.close();
  719.     }
  720.  
  721.     return 0;
  722. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement