Advertisement
Guest User

кирилл-дебил

a guest
Mar 23rd, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3.  
  4. template<class T>
  5. struct node {
  6.     T obj;
  7.     node<T>* next;
  8.     node<T>* prev;
  9. };
  10.  
  11. template<class T>
  12. class linked_list {
  13. public:
  14.     class iterator {
  15.     public:
  16.         iterator(node<T>* ptr_) : curr_node(ptr_) {}
  17.         typedef iterator self_type;
  18.         typedef T& reference;
  19.         typedef T value_type;
  20.         typedef T* pointer;
  21.         typedef std::bidirectional_iterator_tag iterator_category;
  22.         typedef int difference_type;
  23.         ~iterator() = default;
  24.         reference operator * () { return curr_node->obj; }
  25.         self_type operator ++ () { curr_node = curr_node->next; return *this; }
  26.         self_type operator -- () { curr_node = curr_node->prev; return *this; }
  27.         bool operator != (iterator it) { return it.curr_node != curr_node; }
  28.         bool operator == (iterator it) { return it.curr_node == curr_node; }
  29.         bool operator == (std::reverse_iterator<iterator> rit) { return rit.current == curr_node; }
  30.         void operator = (iterator it) { curr_node = it.curr_node; }
  31.     private:
  32.         node<T>* curr_node;
  33.     };
  34.  
  35.     linked_list() { base_node = nullptr; }
  36.     void add(T obj_);
  37.     void print();
  38.     void rprint();
  39.     void delete_all();
  40.     iterator begin() { return iterator(base_node); }
  41.     iterator cbegin() { return iterator(link_node->prev); }
  42.     std::reverse_iterator<iterator> rbegin() { return std::reverse_iterator<iterator>(link_node->prev); }
  43.     std::reverse_iterator<iterator> rend() { return std::reverse_iterator<iterator>(link_node->next); }
  44.     iterator end() { return iterator(link_node); }
  45.     iterator cend() { return iterator(link_node); }
  46. private:
  47.     node<T>* base_node;
  48.     node<T>* link_node;
  49. };
  50.  
  51. template<class T>
  52. void linked_list<T>::print() {
  53.     if (!base_node) return;
  54.     node<T>* curr = base_node;
  55.     do {
  56.         std::cout << curr->obj << " ";
  57.         curr = curr->next;
  58.     } while (curr != link_node);
  59. }
  60.  
  61. template<class T>
  62. void linked_list<T>::rprint() {
  63.     if (!base_node) return;
  64.     node<T>* curr = link_node->prev;
  65.     do {
  66.         std::cout << curr->obj << " ";
  67.         curr = curr->prev;
  68.     } while (curr != link_node);
  69. }
  70.  
  71. template<class T>
  72. void linked_list<T>::add(T obj_) {
  73.     node<T>* new_node = new node<T>;
  74.     new_node->obj = obj_;
  75.     if (!base_node) {
  76.         base_node = new_node;
  77.         link_node = new node<T>;
  78.         base_node->prev = base_node->next = link_node;
  79.         link_node->next = base_node;
  80.         link_node->prev = base_node;
  81.         return;
  82.     }
  83.     new_node->prev = link_node->prev;
  84.     link_node->prev->next = new_node;
  85.     link_node->prev = new_node;
  86.     new_node->next = link_node;
  87. }
  88.  
  89. template<class T>
  90. void linked_list<T>::delete_all() {
  91.     node<T>* curr = base_node;
  92.     while (curr != link_node) {
  93.         base_node = base_node->next;
  94.         delete curr;
  95.         curr = base_node;
  96.     }
  97.     delete link_node;
  98.     link_node = base_node = nullptr;
  99. }
  100. int main() {
  101.     int i = 0;
  102.     linked_list<int> ll;
  103.     ll.add(1); ll.add(2); ll.add(3);
  104.     //ll.delete_all();
  105.     ll.print();
  106.     //std::for_each(ll.begin(), ll.end(), [](int i){ std::cout « i*i « " "; });
  107.     std::for_each(ll.rbegin(), ll.rend(), [](int i) { std::cout << i*i << " "; });
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement