Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.78 KB | None | 0 0
  1. #ifndef _LIST_H
  2. #define _LIST_H
  3. #include "Node.h"
  4. #include <string>
  5. #include <iostream>
  6. template <class T>
  7. class List
  8. {
  9. /*
  10. Die Klasse List dient zur Verwaltung von Knoten (Node). Mit Hilfe der Klasse List
  11. kann ein Stapel oder Warteschlange realisiert werden.
  12. */
  13. private:
  14. struct form { std::string start = "<< "; std::string zwischen = ", "; std::string ende = " >>\n"; } _form;
  15. Node<T> * head, *tail;
  16. int _size;
  17. public:
  18. List<T>();
  19. // List(List & _List); // Copy Operator überladen
  20. ~List<T>();
  21. void InsertFront(T key); // Einfügen eines Knotens am Anfang
  22. void InsertBack(T key); // Einfügen eines Knotesn am Ende
  23. bool getFront(T & key); // Entnehmen eines Knoten am Anfang
  24. bool getBack(T & key); // Entnehmen eines Knoten am Ende
  25. bool del(T key); // löschen eines Knotens [key]
  26. bool search(T key); // Suchen eines Knoten
  27. bool swap(T key1, T key2); // Knoten in der Liste vertauschen
  28. int size(void); // Größe der Lise (Anzahl der Knoten)
  29. bool test(void); // Überprüfen der Zeigerstruktur der Liste
  30. void format(const std::string & start, const std::string & zwischen, const std::string & ende); // Mit der format−Methode kann die Ausgabe gesteuert werden: operator <<
  31. List<T> & operator = (const List<T> & List); // Zuweisungsoperator definieren
  32. List<T> & operator = (const List<T> * List); // Zuweisungsoperator definieren
  33. List<T> & operator + (const List<T> & List_Append) const; // Listen zusammenfuehren zu einer Liste
  34. List<T> & operator + (const List<T> * List_Append) const; // Listen zusammenfuehren zu einer Liste
  35. template <typename T>
  36. friend std::ostream & operator << (std::ostream & stream, const List<T> & Liste); // Ausgabeoperator ueberladen
  37. template <typename T>
  38. friend std::ostream & operator << (std::ostream & stream, const List<T> * Liste); // Ausgabeoperator ueberladen
  39. };
  40.  
  41. template <class T>
  42. List<T>::List()
  43. {
  44. head = new Node<T>;
  45. tail = new Node<T>;
  46. _size = 0;
  47. head->next = tail;
  48. tail->prev = head;
  49. }
  50.  
  51. template <class T>
  52. List<T>::~List() {
  53. Node<T> *del = head;
  54. Node<T> *temp = head->next;
  55. while (temp->next != nullptr) {
  56. delete del;
  57. del = temp;
  58. temp = temp->next;
  59. }
  60. }
  61.  
  62. template <class T>
  63. void List<T>::InsertFront(T key) {
  64. Node<T> *new_Node = new Node<T>(key, nullptr, head);
  65. if (head->next != tail) {
  66. new_Node->next = head->next;
  67. head->next->prev = new_Node;
  68. }
  69. head->next = new_Node;
  70. if (_size == 0) {
  71. new_Node->next = tail;
  72. tail->prev = new_Node;
  73. }
  74. _size++;
  75. }
  76.  
  77. template <class T>
  78. void List<T>::InsertBack(T key) {
  79. Node<T> *new_Node = new Node<T>(key, tail);
  80. if (tail->prev != head) {
  81. new_Node->prev = tail->prev;
  82. tail->prev->next = new_Node;
  83. }
  84. tail->prev = new_Node;
  85. if (_size == 0) {
  86. new_Node->prev = head;
  87. head->next = new_Node;
  88. }
  89. _size++;
  90. }
  91.  
  92. template <class T>
  93. bool List<T>::getFront(T & key) {
  94. if (head->next != tail) {
  95. Node<T> *temp = new Node<T>;
  96. temp = head->next;
  97. tail->next = temp->next;
  98. std::cout << temp->key << std::endl;
  99. temp->next->prev = tail;
  100. _size--;
  101. return true;
  102. }
  103. else
  104. return false;
  105. }
  106.  
  107. template <class T>
  108. bool List<T>::getBack(T & key) {
  109. if (tail->prev != head) {
  110. Node<T> *temp = tail->prev;
  111. tail->prev = temp->prev;
  112. tail->prev->next = tail;
  113. key = temp->key;
  114. _size--;
  115. delete temp;
  116. return true;
  117. }
  118. else
  119. return false;
  120. }
  121.  
  122. template <class T>
  123. bool List<T>::del(T key) {
  124. Node<T> *temp = new Node();
  125. temp = head->next;
  126. while (temp->next != tail) {
  127. if (temp->key == key) {
  128. temp->prev->next = temp->next;
  129. temp->next->prev = temp->prev;
  130. delete temp;
  131. _size--;
  132. return true;
  133. }
  134. temp = temp->next;
  135. }
  136. delete temp;
  137. return false;
  138. }
  139.  
  140. template <class T>
  141. bool List<T>::search(T key) { //sucht nach einem Node<T> mit key == int key
  142. Node<T> temp = *head->next;
  143. while (temp.next != tail) {
  144. if (temp.key == key) {
  145. return true;
  146. }
  147. else
  148. temp = *temp.next;
  149. }
  150.  
  151. return false;
  152. }
  153.  
  154. template <class T>
  155. bool List<T>::swap(T key1, T key2) {
  156. if (!this->search(key1) || !this->search(key2))
  157. return 0;
  158. Node<T> *temp_1 = head->next;
  159. while (temp_1->next != tail) {
  160. if (temp_1->key == key1 || temp_1->key == key2) {
  161. break;
  162. }
  163. temp_1 = temp_1->next;
  164. }
  165. Node<T> *temp_2 = tail->prev;
  166. while (temp_2->prev != head) {
  167. if (temp_2->key == key1 || temp_2->key == key2) {
  168. break;
  169. }
  170. temp_2 = temp_2->prev;
  171. }
  172.  
  173. if (temp_1->next != temp_2 || temp_2->prev != temp_1) {
  174. temp_1->prev->next = temp_2;
  175. temp_2->prev->next = temp_1;
  176.  
  177. temp_1->next->prev = temp_2;
  178. temp_2->next->prev = temp_1;
  179.  
  180. Node<T> *temp = new Node<T>;
  181. temp->prev = temp_1->prev;
  182. temp->next = temp_1->next;
  183.  
  184. temp_1->next = temp_2->next;
  185. temp_1->prev = temp_2->prev;
  186.  
  187. temp_2->prev = temp->prev;
  188. temp_2->next = temp->next;
  189. }
  190. else {
  191. temp_1->next = temp_2->next;
  192. temp_1->prev->next = temp_2;
  193. temp_1->prev = temp_2;
  194. temp_2->prev = temp_1->prev;
  195. temp_2->next->prev = temp_1;
  196. temp_2->next = temp_1;
  197. }
  198.  
  199.  
  200. return true;
  201. }
  202.  
  203. template <class T>
  204. int List<T>::size(void) {
  205. return _size;
  206. }
  207.  
  208. template <class T>
  209. bool List<T>::test(void) {
  210. Node<T> *temp = head;
  211. for (int i = 0; i < _size; i++) {
  212. temp = temp->next;
  213. }
  214. if (temp->next != tail) {
  215. delete temp;
  216. return false;
  217. }
  218. temp = tail;
  219. for (int i = 0; i < _size; i++) {
  220. temp = temp->prev;
  221. }
  222. if (temp->prev != head) {
  223. delete temp;
  224. return false;
  225. }
  226. return true;
  227. }
  228.  
  229. template <class T>
  230. void List<T>::format(const std::string & start, const std::string & zwischen, const std::string & ende) {
  231. // Setzen der Formatierung für den überladenen Streamingoperator <<
  232. _form.start = start; // Ausgabe zu Beginn der Liste
  233. _form.zwischen = zwischen; // Ausgabe zwischen zwei Knoten
  234. _form.ende = ende; // Ausgabe am Ende der Liste
  235. }
  236.  
  237. template <class T>
  238. List<T> & List<T>::operator = (const List & _List) {
  239. // in dem Objekt _List sind die Knoten enthalten, die Kopiert werden sollen.
  240. // Kopiert wird in das Objekt "this"
  241. if (this == &_List) return *this; // !! keine Aktion notwendig
  242. Node<T> * tmp_node = new Node<T>;
  243. if (_size)
  244. {
  245. Node<T> * tmp_del;
  246. tmp_node = head->next;
  247. while (tmp_node != tail) // Alle eventuell vorhandenen Knoten in this löschen
  248. {
  249. tmp_del = tmp_node;
  250. tmp_node = tmp_node->next;
  251. delete tmp_del;
  252. }
  253. _size = 0;
  254. head->next = tail;
  255. tail->prev = head;
  256. }
  257. tmp_node = _List.head->next;
  258. while (tmp_node != _List.tail)
  259. {
  260. InsertBack(tmp_node->key);
  261. tmp_node = tmp_node->next;
  262. }
  263. return *this;
  264. }
  265.  
  266. template <class T>
  267. List<T> & List<T>::operator = (const List * _List) {
  268. // in dem Objekt _List sind die Knoten enthalten, die Kopiert werden sollen.
  269. // Kopiert wird in das Objekt "this"
  270. if (this == _List) return *this; // !! keine Aktion notwendig
  271. Node<T> * tmp_node = new Node<T>;;
  272. if (_size)
  273. {
  274. Node<T> * tmp_del;
  275. tmp_node = head->next;
  276. while (tmp_node != tail) // Alle eventuell vorhandenen Knoten in this löschen
  277. {
  278. tmp_del = tmp_node;
  279. tmp_node = tmp_node->next;
  280. delete tmp_del;
  281. }
  282. _size = 0;
  283. head->next = tail;
  284. tail->prev = head;
  285. }
  286. tmp_node = _List->head->next;
  287. while (tmp_node != _List->tail)
  288. {
  289. InsertBack(tmp_node->key);
  290. tmp_node = tmp_node->next;
  291. }
  292. return *this;
  293. }
  294.  
  295. template <class T>
  296. List<T> & List<T>::operator + (const List<T> & List_Append) const {
  297. List * tmp = new List;
  298. Node<T> * tmp_node = new Node<T>;
  299. tmp_node = head->next;
  300. while (tmp_node != tail) {
  301. tmp->InsertBack(tmp_node->key);
  302. tmp_node = tmp_node->next;
  303. }
  304. if (!List_Append._size) return *tmp;
  305. tmp_node = List_Append.head->next;
  306. while (tmp_node != List_Append.tail) {
  307. tmp->InsertBack(tmp_node->key);
  308. tmp_node = tmp_node->next;
  309. }
  310. return *tmp;
  311. }
  312.  
  313. template <class T>
  314. List<T> & List<T>::operator + (const List * List_Append) const {
  315. List * tmp = new List;
  316. Node<T> * tmp_node;
  317. tmp_node = head->next;
  318. while (tmp_node != tail) {
  319. tmp->InsertBack(tmp_node->key);
  320. tmp_node = tmp_node->next;
  321. }
  322. if (!List_Append->_size) return *tmp;
  323. tmp_node = List_Append->head->next;
  324. while (tmp_node != List_Append->tail) {
  325. tmp->InsertBack(tmp_node->key);
  326. tmp_node = tmp_node->next;
  327. }
  328. return *tmp;
  329. }
  330.  
  331. template <class T>
  332. std::ostream & operator<<(std::ostream & stream, List<T> const & Liste) {
  333. stream << Liste._form.start;
  334. for (Node<T> * tmp = Liste.head->next; tmp != Liste.tail; tmp = tmp->next)
  335. stream << tmp->key << (tmp->next == Liste.tail ? Liste._form.ende : Liste._form.zwischen);
  336. return stream;
  337. }
  338.  
  339. template <class T>
  340. std::ostream & operator << (std::ostream & stream, const List<T> * Liste)
  341. {
  342. stream << Liste->_form.start;
  343. for (Node<T> * tmp = Liste->head->next; tmp != Liste->tail; tmp = tmp->next)
  344. stream << tmp->key << (tmp->next == Liste->tail ? Liste->_form.ende : Liste->_form.zwischen);
  345. return stream;
  346. }
  347. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement