Advertisement
igoryanchik

1.3, 1.4, 1.5

Sep 11th, 2023 (edited)
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <vector>
  4. #include <string>
  5. #include <random>
  6. #include <ctime>
  7. using namespace std;
  8.  
  9. template <class T>
  10. class Element
  11. {
  12.     //элемент связного списка
  13. private:
  14.  
  15.     //указатель на предыдущий и следующий элемент
  16.     Element* next;
  17.     Element* prev;
  18.  
  19.     //информация, хранимая в поле
  20.     T field;
  21. public:
  22.     Element(T value = 0, Element<T>* next_ptr = NULL, Element<T>* prev_ptr = NULL)
  23.     {
  24.         field = value;
  25.         next = next_ptr;
  26.         prev - prev_ptr;
  27.     }
  28.     //доступ к полю *next
  29.     virtual Element* getNext() { return next; }
  30.     virtual void setNext(Element* value) { next = value; }
  31.  
  32.     //доступ к полю *prev
  33.     virtual Element* getPrevious() { return prev; }
  34.     virtual void setPrevious(Element* value) { prev = value; }
  35.  
  36.     //доступ к полю с хранимой информацией field
  37.     virtual T getValue() { return field; }
  38.     virtual void setValue(T value) { field = value; }
  39.  
  40.     template<class T> friend ostream& operator<< (ostream& ustream, Element<T>& obj);
  41. };
  42. template<class T>
  43. ostream& operator << (ostream& ustream, Element<T>& obj)
  44. {
  45.     ustream << obj.field;
  46.     return ustream;
  47. }
  48. template <class T>
  49. class LinkedListParent
  50. {
  51. protected:
  52.     //достаточно хранить начало и конец
  53.     Element<T>* head;
  54.     Element<T>* tail;
  55.  
  56.     //для удобства храним количество элементов
  57.     int num;
  58. public:
  59.  
  60.     virtual int Number() { return num; }
  61.     virtual Element<T>* getBegin() { return head; }
  62.     virtual Element<T>* getEnd() { return tail; }
  63.  
  64.     LinkedListParent()
  65.     {
  66.         //конструктор без параметров
  67.         cout << "\nParent constructor";
  68.         head = NULL;
  69.         num = 0;
  70.     }
  71.     //чисто виртуальная функция: пока не определимся с типом списка, не сможем реализовать добавление
  72.     virtual Element<T>* push(T value) = 0;
  73.  
  74.     //чисто виртуальная функция: пока не определимся с типом списка, не сможем реализовать удаление
  75.     virtual Element<T>* pop() = 0;
  76.  
  77.     virtual ~LinkedListParent()
  78.     {
  79.         Element<T>* it = head;
  80.         while (it != nullptr)
  81.         {
  82.             Element<T>* cur = it->next;
  83.             delete it;
  84.             it = cur;
  85.         }
  86.         delete it;
  87.     }
  88.  
  89.     //получение элемента по индексу - какова асимптотическая оценка этого действия ?
  90.     virtual Element<T>* operator[](int i)
  91.     {
  92.         //индексация
  93.         if (i<0 || i>num) return NULL;
  94.  
  95.         int k = 0;
  96.         //ищем i-й элемент - вставем в начало и отсчитываем i шагов вперед
  97.         Element<T>* cur = head;
  98.         for (k = 0; k < i; k++)
  99.         {
  100.             cur = cur->getNext();
  101.         }
  102.         return cur;
  103.     }
  104.  
  105.     template<class T> friend ostream& operator<< (ostream&
  106.         ustream, LinkedListParent<T>& obj);
  107.  
  108.     template<class T> friend istream& operator>> (istream&
  109.         ustream, LinkedListParent<T>& obj);
  110. };
  111. template<class T>
  112. ostream& operator << (ostream& ustream, LinkedListParent<T>& obj)
  113. {
  114.     if (typeid(ustream).name() == typeid(ofstream).name())
  115.     {
  116.         ustream << obj.num << "\n";
  117.         for (Element<T>* current = obj.getBegin(); current !=
  118.             NULL; current = current->getNext())
  119.             ustream << current->getValue() << " ";
  120.         return ustream;
  121.     }
  122.  
  123.     ustream << "\nLength: " << obj.num << "\n";
  124.  
  125.     int i = 0;
  126.  
  127.     for (Element<T>* current = obj.getBegin(); current != NULL; current = current->getNext(), i++)
  128.         ustream << "arr[" << i << "] = " << current->getValue() << "\n";
  129.  
  130.     return ustream;
  131. }
  132. template<class T>
  133. istream& operator >> (istream& ustream, LinkedListParent<T>& obj)
  134. {
  135.     //чтение из файла и консоли совпадают
  136.     int len;
  137.     ustream >> len;
  138.     //здесь надо очистить память под obj, установить obj.num = 0
  139.     double v = 0;
  140.     for (int i = 0; i < len; i++)
  141.     {
  142.         ustream >> v;
  143.         obj.push(v);
  144.     }
  145.     return ustream;
  146. }
  147. template<typename ValueType>
  148. class ListIterator : public std::iterator<std::input_iterator_tag, ValueType>
  149. {
  150. private:
  151. public:
  152.     ListIterator() { ptr = NULL; }
  153.     //ListIterator(ValueType* p) { ptr = p; }
  154.     ListIterator(Element<ValueType>* p) { ptr = p; }
  155.     ListIterator(const ListIterator& it) { ptr = it.ptr; }
  156.     bool operator!=(ListIterator const& other) const {
  157.         return
  158.             ptr != other.ptr;
  159.     }
  160.     bool operator==(ListIterator const& other) const {
  161.         return
  162.             ptr == other.ptr;
  163.     }//need for BOOST_FOREACH
  164.     Element<ValueType>& operator*()
  165.     {
  166.         return *ptr;
  167.     }
  168.     ListIterator& operator++() {
  169.         ptr = ptr->getNext(); return
  170.             *this;
  171.     }
  172.     ListIterator& operator++(int v) {
  173.         ptr = ptr->getNext();
  174.         return *this;
  175.     }
  176.     ListIterator& operator=(const ListIterator& it) {
  177.         ptr =
  178.             it.ptr; return *this;
  179.     }
  180.     ListIterator& operator=(Element<ValueType>* p) {
  181.         ptr = p;
  182.         return *this;
  183.     }
  184. private:
  185.     Element<ValueType>* ptr;
  186. };
  187. template <class T>
  188. class IteratedLinkedList : public LinkedListParent<T>
  189. {
  190. public:
  191.     IteratedLinkedList() : LinkedListParent<T>()
  192.     {
  193.         cout << "\nIteratedLinkedList constructor";
  194.     }
  195.  
  196.     virtual ~IteratedLinkedList()
  197.     {
  198.         cout << "\nIteratedLinkedList destructor";
  199.     }
  200.     ListIterator<T> iterator;
  201.  
  202.     ListIterator<T> begin()
  203.     {
  204.         ListIterator<T> it = LinkedListParent<T>::head; return it;
  205.     }
  206.  
  207.     ListIterator<T> end()
  208.     {
  209.         ListIterator<T> it = LinkedListParent<T>::tail; return it;
  210.     }
  211. };
  212.  
  213.  
  214.  
  215. template<class T>
  216. class Queue : public IteratedLinkedList<T>
  217. {
  218. public:
  219.  
  220.     Queue() = default;
  221.  
  222.     virtual Element<T>* push(T value)
  223.     {
  224.         if (this->head == nullptr)
  225.         {
  226.             this->head = new Element<T>(value);
  227.             if (this->head == 0) throw "MemoryAllocation";
  228.             this->tail = this->head;
  229.         }
  230.         else
  231.         {
  232.             this->tail->next = new Element<T>(value);
  233.             if (this->tail->next == 0) throw "MemoryAllocation";
  234.             this->tail = this->tail->next;
  235.         }
  236.         this->num++;
  237.  
  238.         return this->tail;
  239.     }
  240.  
  241.  
  242.     virtual Element<T>* pop()
  243.     {
  244.         if (this->head == nullptr)
  245.         {
  246.             cout << "Queue is empty";
  247.             return;
  248.         }
  249.         else
  250.         {
  251.             this->head = this->head->next;
  252.             delete this->head->prev;
  253.             this->head->prev = nullptr;
  254.  
  255.         }
  256.         this->num--;
  257.  
  258.         return this->head;
  259.     }
  260.  
  261.     !Queue() = default;
  262. };
  263.  
  264. template<class T>
  265. class Priority_queue : public Queue<T>
  266. {
  267. public:
  268.  
  269.     Priority_queue() = default;
  270.  
  271.     Element<T>* push(T value)
  272.     {
  273.         if (this->head == nullptr)
  274.         {
  275.             this->head = new Element<T>(value);
  276.             if (this->head == 0) throw "MemoryAllocation";
  277.             this->tail = this->head;
  278.         }
  279.         else
  280.         {
  281.             Element<T>* iter = this->head;
  282.             for (iter; iter != nullptr; iter = iter->next)
  283.             {
  284.                 if (value < iter->field)
  285.                 {
  286.                     iter->prev = new Element<T>(value, iter, iter->prev);
  287.                     if (iter->prev == 0) throw "MemoryAllocation";
  288.                     break;
  289.                 }
  290.             }
  291.         }
  292.         this->num++;
  293.  
  294.         return this->tail;
  295.     }
  296.     !Priority_queue() = default;
  297. };
  298.  
  299. class Book
  300. {
  301. private:
  302.     string first_name_a;
  303.     string second_name_a;
  304.     string titel;
  305.     string publisher;
  306.     int count;
  307.     int year;
  308.     int paper;
  309.     int electronic;
  310.     int audio;
  311.  
  312. public:
  313.  
  314.     Book(string const f = " ", string const s = " ", string const t = " ",
  315.         string const p = " ", int c = 0, int y = 0, int ta = 0, int  tp = 0, int te = 0)
  316.     {
  317.         first_name_a = f;
  318.         second_name_a = s;
  319.         titel = t;
  320.         publisher = p;
  321.         count = c;
  322.         year = y;
  323.         paper = ta;
  324.         electronic = tp;
  325.         audio = te;
  326.     }
  327.  
  328.     bool operator < (const Book& B) const
  329.     {
  330.         return ((count < B.count) + ((count != B.count) * (year < B.year)) +
  331.             ((count != B.count) * (year != B.year) * (titel < B.titel)));
  332.     }
  333.  
  334.     bool operator ==(const Book& B) const
  335.     {
  336.         return !(*this < B) && !(B < *this);
  337.     }
  338.  
  339.     int count_() { return count; }
  340.     int year_() { return year; }
  341.     string titel_() { return titel; }
  342.  
  343.     void print() const
  344.     {
  345.         cout << "\nName authot: " << first_name_a << "\nSurname author: " << second_name_a <<
  346.             "\nTitel of book: " << titel << "\nCount books: " << count << "\nPublisher: " << publisher <<
  347.             "\nYear of publication: " << year << "\nNumber of paper books: " << paper << "\nNumber of electronic books:" <<
  348.             electronic << "\nNumber of audio books:" << audio << '\n';
  349.     }
  350.  
  351.     ~Book() = default;
  352.  
  353.     friend Book fill(Book& V);
  354. };
  355. Book fill(Book& V)
  356. {
  357.     srand(time(NULL));
  358.  
  359.     string names[5] = { "Alice", "Bob", "Carla", "David", "Eva" };
  360.     string surnames[5] = { "Smith", "Johnson", "Brown", "Davis", "Wilson" };
  361.     string publishers[5] = { "Penguin Random House", "HarperCollins", "Simon & Schuster", "Macmillan Publishers", "Hachette Livre" };
  362.     string books[5] = { "To Kill a Mockingbird", "1984", "The Great Gatsby", "Pride and Prejudice", "The Catcher in the Rye" };
  363.  
  364.     int i1 = rand() % 5, i2 = rand() % 5, i3 = rand() % 5, i4 = rand() % 5,
  365.         i5 = rand() % 5000, i6 = rand() % 2023, i7 = rand() % 1000, i8 = rand() % 1000, i9 = rand() % 1000;
  366.  
  367.     V.first_name_a = names[i1];
  368.     V.second_name_a = surnames[i2];
  369.     V.titel = books[i3];
  370.     V.publisher = publishers[i4];
  371.     V.count = i5;
  372.     V.year = i6;
  373.     V.paper = i7;
  374.     V.electronic = i8;
  375.     V.audio = i9;
  376.  
  377.     return V;
  378. }
  379.  
  380. bool  vowels(char c)
  381. {
  382.     return (c == 'A' || c == 'a' ||
  383.         c == 'E' || c == 'e' ||
  384.         c == 'I' || c == 'i' ||
  385.         c == 'O' || c == 'o' ||
  386.         c == 'U' || c == 'u' ||
  387.         c == 'Y' || c == 'y');
  388. }
  389.  
  390. template <class T>
  391. list<T> filter(const list<T>& lst, bool(*comp)(T))
  392. {
  393.     if (comp == nullptr) throw "nullptr";
  394.  
  395.     list<T> ans;
  396.     for (auto it = lst.begin(); it != lst.end(); ++it)
  397.     {
  398.         if (comp(*it))
  399.             ans.push_back(*it);
  400.     }
  401.  
  402.     return ans;
  403. }
  404.  
  405. template<class T>
  406. void push(list<T>& lst, const T& element)
  407. {
  408.     auto i = lst.begin();
  409.     for (i; i != lst.end(); ++i)
  410.         if (element < *i)
  411.             break;
  412.  
  413.     lst.insert(i, element);
  414. }
  415.  
  416. template<class T>
  417. void pop(list<T>& l, typename list<T>::const_iterator it)
  418. {
  419.     if (l.size() != 0)
  420.         l.erase(it);
  421. }
  422.  
  423. template<class T>
  424. void print(list<T>& const lst)
  425. {
  426.     for (auto i = lst.begin(); i != lst.end(); ++i)
  427.         cout << *i << " ";
  428.  
  429.     cout << '\n';
  430. }
  431.  
  432.  
  433. int main()
  434. {
  435.     list<char> lst;
  436.     bool(*ptr)(char) = &vowels;
  437.  
  438.     for (char i = 'A'; i < 'Z'; ++i)
  439.         lst.push_back(i);
  440.  
  441.     print(lst);
  442.     cout << '\n';
  443.  
  444.     list<char> lst2 = filter(lst, ptr);
  445.  
  446.     print(lst2); cout << '\n';
  447.  
  448.     list<Book> lst3;
  449.  
  450.     for (int i = 0; i < 5; ++i)
  451.     {
  452.         Book A;
  453.         fill(A);
  454.         push(lst3, A);
  455.     }
  456.  
  457.     return 0;
  458. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement