Advertisement
Guest User

DLYANIKITY

a guest
Mar 23rd, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include "stdafx.h"
  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