Advertisement
Guest User

Untitled

a guest
Feb 18th, 2018
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.76 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3.  
  4. using namespace std;
  5.  
  6. template<typename T>
  7. class List {
  8. private:
  9. class Elem {
  10. public:
  11. Elem() {}
  12. Elem* Next;
  13. Elem* Prev;
  14. Elem* Head;
  15. virtual T* GetVal() {
  16. return nullptr;
  17. }
  18. };
  19.  
  20. class Node : public Elem {
  21. public:
  22. Node(const T & value) : val(value) {}
  23. Node(T && value) : val(move(value)) {}
  24. Node(const Elem& tmp) : val(tmp.val) {}
  25. Node(Elem && tmp) : val(move(tmp.value)) {}
  26. T* GetVal() override {
  27. return &val;
  28. }
  29. Node* Nextnode;
  30. Node* Prevnode;
  31. T val;
  32. };
  33.  
  34. Elem* Header;
  35. Node *Beg, *Fin;
  36. size_t _size;
  37.  
  38. public:
  39. List() : Header(new Elem), Beg(nullptr), Fin(nullptr), _size(0) {
  40. Header->Next = Header;
  41. Header->Prev = Header;
  42. Header->Head = Header;
  43. }
  44.  
  45. List(const List& tmp) : Header(new Elem), Beg(nullptr), Fin(nullptr), _size(tmp._size) {
  46. Header->Next = Header;
  47. Header->Prev = Header;
  48. Header->Head = Header;
  49. if (tmp.Beg != nullptr) {
  50. Node* tmp_cur = tmp.Beg;
  51. Node *cur = new Node(*tmp_cur);
  52. cur->Next = nullptr;
  53. cur->Prev = Header;
  54. cur->Prevnode = nullptr;
  55. cur->Nextnode = nullptr;
  56. Beg = cur;
  57. Node *next = cur;
  58. while (tmp_cur->Nextnode != nullptr) {
  59. tmp_cur = tmp_cur->Nextnode;
  60. next = new Node(*tmp_cur);
  61. next->Prev = cur;
  62. next->Prevnode = cur;
  63. next->Next = nullptr;
  64. next->Nextnode = nullptr;
  65. cur->Next = next;
  66. cur->Nextnode = next;
  67. cur = next;
  68. }
  69. Fin = cur;
  70. Fin->Next = Header;
  71. cur = next = nullptr;
  72. Header->Prev = Fin;
  73. Header->Next = Beg;
  74. }
  75. }
  76.  
  77. List& operator = (const List& tmp) {
  78. ClearNode();
  79. _size = tmp._size;
  80. if (tmp.Beg != nullptr) {
  81. Node* tmp_cur = tmp.Beg;
  82. Node *cur = new Node(*tmp_cur);
  83. cur->Next = nullptr;
  84. cur->Prev = Header;
  85. cur->Prevnode = nullptr;
  86. cur->Nextnode = nullptr;
  87. Beg = cur;
  88. Node *next = cur;
  89. while (tmp_cur->Nextnode != nullptr) {
  90. tmp_cur = tmp_cur->Nextnode;
  91. next = new Node(*tmp_cur);
  92. next->Prev = cur;
  93. next->Prevnode = cur;
  94. next->Next = nullptr;
  95. next->Nextnode = nullptr;
  96. cur->Next = next;
  97. cur->Nextnode = next;
  98. cur = next;
  99. }
  100. Fin = cur;
  101. Fin->Next = Header;
  102. cur = next = nullptr;
  103. Header->Prev = Fin;
  104. Header->Next = Beg;
  105. }
  106. return *this;
  107. }
  108.  
  109. ~List() {
  110. ClearNode();
  111. delete Header;
  112. }
  113.  
  114. void ClearNode() {
  115. while (Beg != nullptr) {
  116. if (Beg != Fin) {
  117. Node *temp = Beg;
  118. Beg = Beg->Nextnode;
  119. delete temp;
  120. Beg->Prev = nullptr;
  121. } else {
  122. Beg = nullptr;
  123. delete Fin;
  124. Fin = nullptr;
  125. }
  126. }
  127. }
  128.  
  129. void push_back(const T& val) {
  130. Node *temp = new Node(val);
  131. temp->Head = nullptr;
  132. temp->Next = Header;
  133. temp->Nextnode = nullptr;
  134. temp->Prevnode = Fin;
  135. if (Beg != nullptr) {
  136. temp->Prev = Fin;
  137. Fin->Next = temp;
  138. Fin->Nextnode = temp;
  139. if (Beg == Fin) {
  140. Beg->Next = temp;
  141. Beg->Nextnode = temp;
  142. }
  143. Fin = temp;
  144. } else {
  145. temp->Prev = Header;
  146. Beg = temp;
  147. Fin = temp;
  148. }
  149. Header->Next = Beg;
  150. Header->Prev = Fin;
  151. _size++;
  152. }
  153.  
  154. void push_front(const T& val) {
  155. Node *temp = new Node(val);
  156. temp->Head = nullptr;
  157. temp->Prev = Header;
  158. temp->Prevnode = nullptr;
  159. temp->Nextnode = Beg;
  160. if (Beg != nullptr) {
  161. temp->Next = Beg;
  162. Beg->Prev = temp;
  163. Beg->Prevnode = temp;
  164. if (Beg == Fin) {
  165. Fin->Prev = temp;
  166. Fin->Prevnode = temp;
  167. }
  168. Beg = temp;
  169. } else {
  170. temp->Next = Header;
  171. Beg = temp;
  172. Fin = temp;
  173. }
  174. Header->Next = Beg;
  175. Header->Prev = Fin;
  176. _size++;
  177. }
  178.  
  179. void push_back(T&& val) {
  180. Node *temp = new Node(move(val));
  181. temp->Head = nullptr;
  182. temp->Next = Header;
  183. temp->Nextnode = nullptr;
  184. temp->Prevnode = Fin;
  185. if (Beg != nullptr) {
  186. temp->Prev = Fin;
  187. Fin->Next = temp;
  188. Fin->Nextnode = temp;
  189. if (Beg == Fin) {
  190. Beg->Next = temp;
  191. Beg->Nextnode = temp;
  192. }
  193. Fin = temp;
  194. } else {
  195. temp->Prev = Header;
  196. Beg = temp;
  197. Fin = temp;
  198. }
  199. Header->Next = Beg;
  200. Header->Prev = Fin;
  201. _size++;
  202. }
  203.  
  204. void push_front(T&& val) {
  205. Node *temp = new Node(move(val));
  206. temp->Head = nullptr;
  207. temp->Prev = Header;
  208. temp->Prevnode = nullptr;
  209. temp->Nextnode = Beg;
  210. if (Beg != nullptr) {
  211. temp->Next = Beg;
  212. Beg->Prev = temp;
  213. Beg->Prevnode = temp;
  214. if (Beg == Fin) {
  215. Fin->Prev = temp;
  216. Fin->Prevnode = temp;
  217. }
  218. Beg = temp;
  219. } else {
  220. temp->Next = Header;
  221. Beg = temp;
  222. Fin = temp;
  223. }
  224. Header->Next = Beg;
  225. Header->Prev = Fin;
  226. _size++;
  227. }
  228.  
  229.  
  230. void pop_back() {
  231. if (Beg != nullptr) {
  232. if (Beg != Fin) {
  233. Node *temp = Fin;
  234. Fin = Fin->Prevnode;
  235. delete temp;
  236. Fin->Next = Header;
  237. Header->Prev = Fin;
  238. } else {
  239. Beg = nullptr;
  240. delete Fin;
  241. Fin = nullptr;
  242. Header->Next = Header;
  243. Header->Prev = Header;
  244. }
  245.  
  246. _size--;
  247. } else {
  248. cout << "pop_front FALSE list empty\n";
  249. }
  250. }
  251.  
  252. void pop_front() {
  253. if (Beg != nullptr) {
  254. if (Beg != Fin) {
  255. Node *temp = Beg;
  256. Beg = Beg->Nextnode;
  257. delete temp;
  258. Beg->Prev = Header;
  259. Header->Next = Beg;
  260. } else {
  261. Beg = nullptr;
  262. delete Fin;
  263. Fin = nullptr;
  264. Header->Next = Header;
  265. Header->Prev = Header;
  266. }
  267. _size--;
  268. } else {
  269. cout << "pop_front FALSE list empty\n";
  270. }
  271. }
  272.  
  273. const size_t size() const {
  274. return _size;
  275. }
  276.  
  277.  
  278. class Iterator{
  279. public:
  280. Elem* ptr;
  281. Iterator(Elem* ptr = NULL) : ptr(ptr) {
  282. }
  283. Iterator& operator++(void) {
  284. ptr = ptr->Next;
  285. return *this;
  286. }
  287. Iterator operator++(int) {
  288. Elem* result;
  289. result = ptr;
  290. ptr = ptr->Next;
  291. return result;
  292. }
  293.  
  294. Iterator& operator--(void) {
  295. ptr = ptr->Prev;
  296. return *this;
  297. }
  298.  
  299. Iterator operator--(int) {
  300. Elem* result;
  301. result = ptr;
  302. ptr = ptr->Prev;
  303. return result;
  304. }
  305.  
  306. const T operator* () const {
  307. try {
  308. if (ptr != nullptr && ptr->Head == nullptr) {
  309. return *(ptr->GetVal());
  310. } else {
  311. cout << "Aborted! Dereference of NULLptr!\n";
  312. throw;
  313. }
  314. }
  315. catch (...) {
  316. throw;
  317. }
  318. }
  319.  
  320. bool operator==(Iterator b) {
  321. return (this->ptr == b.ptr);
  322. }
  323.  
  324. bool operator!=(Iterator b) {
  325. return !(*this == b);
  326. }
  327. };
  328.  
  329. const Iterator begin() const {
  330. return Beg;
  331. }
  332.  
  333. const Iterator rbegin() const {
  334. return Fin;
  335. }
  336.  
  337. const Iterator end() const{
  338. if (Beg == nullptr) {
  339. return Beg;
  340. } else {
  341. return Header;
  342. }
  343. }
  344. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement