Advertisement
Guest User

Untitled

a guest
May 20th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. #ifndef _LINKLIST_HPP_
  2. #define _LINKLIST_HPP_
  3. #include<iostream>
  4. #include "Node.hpp"
  5. #include<stdexcept>
  6.  
  7. template<typename T>
  8. class LinkList {
  9. private:
  10. Node<T>* head_{nullptr};
  11. Node<T>* tail_{nullptr};
  12. size_t size_;
  13. public:
  14. LinkList() = default;
  15. LinkList(Node<T>* head, Node<T>* tail, size_t size) : head_{head}, tail_{tail}, size_{size} {}
  16. LinkList(const LinkList<T>& o);
  17. LinkList(LinkList<T>&& o);
  18. LinkList<T>& operator=(const LinkList<T>& o);
  19. LinkList<T>& operator=(const LinkList<T>&& o);
  20. size_t size() { return size_; }
  21. void push_back(const T&);
  22. void push_back(const T&&);
  23. void pop();
  24. // void print(LinkList<T>& queue);
  25. class Iterator;
  26. Iterator begin();
  27. Iterator end();
  28. };
  29.  
  30. template<typename T>
  31. LinkList<T> :: LinkList(const LinkList<T>& o) {
  32. *(this) = o;
  33. }
  34.  
  35. template<typename T>
  36. LinkList<T> :: LinkList(LinkList<T>&& o) {
  37. *(this) = std::move(o);
  38. }
  39.  
  40. template<typename T>
  41. LinkList<T>& LinkList<T> :: operator=(const LinkList<T>& o) {
  42. delete head_;
  43. head_ = nullptr;
  44. head_ = o.head;
  45. tail_ = o.tail_;
  46. size_ = o.size_;
  47. o.head_ = nullptr;
  48. o.tail_ = nullptr;
  49. o.size_ = 0;
  50. return *this;
  51. }
  52.  
  53. template<typename T>
  54. LinkList<T>& LinkList<T> :: operator=(const LinkList<T>&& o) {
  55. delete head_;
  56. head_ = nullptr;
  57. head_ = o.head_;
  58. tail_ = o.tail_;
  59. size_ = o.size_;
  60. o.head_ = nullptr;
  61. o.tail_ = nullptr;
  62. o.size_ = 0;
  63. return *this;
  64. }
  65.  
  66. template<typename T>
  67. void LinkList<T> :: push_back(const T& value) {
  68. if(head_ == nullptr) {
  69. Node<T>* newNode = new Node<T>(value);
  70. head_ = newNode;
  71. tail_ = head_;
  72. size_++;
  73. }
  74. else {
  75. tail_ = makeAndLinkNode(tail_, value);
  76. ++size_;
  77. }
  78. }
  79.  
  80. template<typename T>
  81. void LinkList<T> :: push_back(const T&& value) {
  82. if(head_ == nullptr) {
  83. Node<T>* newNode = new Node<T>(value);
  84. head_ = newNode;
  85. tail_ = head_;
  86. size_++;
  87. }
  88. else {
  89. tail_ = makeAndLinkNode(tail_, value);
  90. ++size_;
  91. }
  92. }
  93.  
  94. template<typename T>
  95. void LinkList<T> :: pop() {
  96. if(head_ == nullptr) throw std::out_of_range("List is empty!");
  97. else {
  98. Node<T>* current = head_;
  99. while(current->advance() && current -> advance() -> advance() != nullptr) {
  100. current = current -> advance();
  101. }
  102. delete current->advance();
  103. current -> linkTo(nullptr);
  104. --size_;
  105. }
  106. }
  107.  
  108. template<typename T>
  109. class LinkList<T> :: Iterator {
  110. private:
  111. Node<T>* myNode_{nullptr};
  112. Node<T>* prevNode_{nullptr};
  113. public:
  114. Iterator() = default;
  115. Iterator(Node<T>* prevNode, Node<T>* myNode) : prevNode_{prevNode}, myNode_{myNode} {}
  116.  
  117. Iterator& operator++() {
  118. prevNode_ = myNode_;
  119. if(myNode_)
  120. myNode_ = myNode_ -> advance();
  121. return *this;
  122. }
  123.  
  124. Iterator operator++(int) {
  125. auto oldThis = *this;
  126. ++(*this);
  127. return oldThis;
  128. }
  129.  
  130. T& operator*() { return **myNode_; }
  131.  
  132. bool operator==(const Iterator& o) const {
  133. return myNode_ == o.myNode_;
  134. }
  135.  
  136. bool operator!=(const Iterator& o) const {
  137. return !operator == (o);
  138. }
  139.  
  140. friend class LinkList<T>;
  141. };
  142.  
  143. template<typename T>
  144. typename LinkList<T> :: Iterator LinkList<T> :: begin() {
  145. return Iterator(nullptr, head_);
  146. }
  147.  
  148. template<typename T>
  149. typename LinkList<T> :: Iterator LinkList<T> :: end() {
  150. return Iterator(tail_, nullptr);
  151. }
  152. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement