Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.13 KB | None | 0 0
  1. #ifndef LISTA_H
  2. #define LISTA_H
  3.  
  4. #include <iostream>
  5. #include <string>
  6. #include <sstream>
  7.  
  8. using namespace std;
  9.  
  10. template<class T>
  11. class Node
  12. {
  13. public:
  14.  
  15. T data;
  16.  
  17. public:
  18.  
  19. Node<T>* prev;
  20. Node<T>* next;
  21.  
  22. Node(T value)
  23. {
  24. data = value;
  25. }
  26.  
  27. ~Node()
  28. {
  29.  
  30. }
  31.  
  32. const T getData() const
  33. {
  34. return data;
  35. }
  36.  
  37. void setData(T value)
  38. {
  39. data = value;
  40. }
  41.  
  42. string toString()
  43. {
  44. stringstream s;
  45. s << this->getData();
  46. return s.str();
  47. }
  48.  
  49. };
  50.  
  51. template<class T>
  52. class Lista
  53. {
  54. public:
  55.  
  56. int size;
  57. Node<T>* head;
  58. Node<T>* tail;
  59.  
  60. public:
  61.  
  62. Lista()
  63. {
  64. head = nullptr;
  65. tail = nullptr;
  66. size = 0;
  67. }
  68.  
  69. ~Lista()
  70. {
  71. clear();
  72. }
  73.  
  74. void push_back(const T value)
  75. {
  76. if (size == 0)
  77. {
  78. push_front(value);
  79. return;
  80. }
  81. Node<T>* temp = new Node<T>{ value };
  82. tail->next = temp;
  83. temp->prev = tail;
  84. tail = temp;
  85. size++;
  86. }
  87.  
  88. void push_front(const T value)
  89. {
  90.  
  91. Node<T>* temp = new Node<T>{ value };
  92. temp->next = head;
  93.  
  94. if (head != nullptr)
  95. {
  96. head->prev = temp;
  97. }
  98.  
  99. head = temp;
  100.  
  101. if (size == 0)
  102. {
  103. tail = head;
  104. }
  105.  
  106. size++;
  107. }
  108.  
  109. void remove_back()
  110. {
  111. if (size == 0)
  112. {
  113. cout << "Nie mam czego usunac - lista pusta" << endl;
  114. return;
  115. }
  116.  
  117. if (size == 1)
  118. {
  119. remove_front();
  120. return;
  121. }
  122.  
  123. Node<T>* temp = tail;
  124. tail = tail->prev;
  125. tail->next = nullptr;
  126. delete temp;
  127. size--;
  128. }
  129.  
  130. void remove_front()
  131. {
  132. if (size == 0)
  133. {
  134. cout << "Nie mam czego usunac - lista pusta ";
  135. return;
  136. }
  137.  
  138. Node<T>* temp = head;
  139. head = head->next;
  140.  
  141. if (head != nullptr)
  142. {
  143. head->prev = nullptr;
  144. }
  145.  
  146. delete temp;
  147. size--;
  148. }
  149.  
  150. void error() {
  151. cout << "Blad" << endl;
  152. exit(EXIT_FAILURE);
  153. }
  154.  
  155. T return_by_index(const int index)
  156. {
  157. Node<T>* temp = head;
  158.  
  159. if (index<0 || index>size)
  160. {
  161. error();
  162. }
  163.  
  164. for (int i = 0; i < index; i++)
  165. {
  166. temp = temp->next;
  167. }
  168.  
  169. return temp->getData();
  170. }
  171.  
  172. void replace(int index, const T& value)
  173. {
  174. if (index<0 || index>size)
  175. {
  176. error();
  177. }
  178.  
  179. Node<T>* temp = head;
  180.  
  181. for (int i = 0; i < index; i++)
  182. {
  183. temp = temp->next;
  184.  
  185. }
  186.  
  187. temp->data = value;
  188.  
  189. }
  190.  
  191. Node<T>* search(const T& value, int (*data)(T, T))
  192. {
  193. if (size == 0)
  194. {
  195. return NULL;
  196. }
  197.  
  198. Node<T>* temp = head;;
  199.  
  200. for (int i = 0; i < size; i++)
  201. {
  202.  
  203. if (!data(temp->getData(), value))
  204. {
  205. return temp;
  206. }
  207.  
  208. temp = temp->next;
  209. }
  210.  
  211. error();
  212.  
  213. }
  214.  
  215. bool remove_by_value(const T& value, int (*data)(T, T))
  216. {
  217. int j = 0;
  218. Node<T>* temp = head;
  219. Node<T>* temp_next;
  220. Node<T>* temp_prev;
  221. Node<T>* del;
  222.  
  223. for (int i = 0; i < size; i++)
  224. {
  225.  
  226. if (!data(temp->getData(), value))
  227. {
  228. del = temp;
  229. temp_prev = del->prev;
  230. temp_next = del->next;
  231. temp_prev->next = temp_next;
  232. temp_next->prev = temp_prev;
  233. temp = temp->next;
  234. delete del;
  235. size--;
  236. j = 1;
  237. return true;
  238. }
  239. else
  240. {
  241. temp = temp->next;
  242. }
  243.  
  244. }
  245. return false;
  246. }
  247.  
  248. void insert(int index, const T& value)
  249. {
  250. if (size == 0)
  251. {
  252. push_front(value);
  253. return;
  254. }
  255.  
  256. if (index == size)
  257. {
  258. push_back(value);
  259. return;
  260. }
  261.  
  262. if (index<0 || index>size)
  263. {
  264. error();
  265. }
  266.  
  267. Node<T>* temp = new Node<T>{ value };
  268. Node<T>* temp_next;
  269. Node<T>* temp_prev = head;
  270.  
  271. for (int i = 0; i < index - 1; i++)
  272. {
  273. temp_prev = temp_prev->next;
  274. }
  275.  
  276. temp_next = temp_prev->next;
  277. temp_prev->next = temp;
  278. temp_next->prev = temp;
  279. temp->next = temp_next;
  280. temp->prev = temp_prev;
  281. size++;
  282. }
  283.  
  284. void clear()
  285. {
  286. Node<T>* temp = tail;
  287. Node<T>* del;
  288.  
  289. while (size != 0)
  290. {
  291. del = temp;
  292. temp = temp->prev;
  293. /*
  294. del->prev = nullptr;
  295. temp->next = nullptr;
  296. */
  297. delete del;
  298. size--;
  299. }
  300. }
  301.  
  302. void print(int a) const
  303. {
  304. Node<T>* temp = head;
  305. cout << "Rozmiar listy: " << size << endl;
  306. cout << "Adres listy: " << head << endl;
  307. cout << "Poczatkowe elementy" << "(" << a << ")" << endl;
  308. for (int i = 0; i < a; i++)
  309. {
  310. cout << temp->getData() << endl;
  311. temp = temp->next;
  312. }
  313. }
  314.  
  315. };
  316.  
  317.  
  318. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement