Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.20 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();
  19. // List(List & _List); // Copy Operator überladen
  20. ~List();
  21. void InsertFront(int key); // Einfügen eines Knotens am Anfang
  22. void InsertBack(int key); // Einfügen eines Knotesn am Ende
  23. bool getFront(int & key); // Entnehmen eines Knoten am Anfang
  24. bool getBack(int & key); // Entnehmen eines Knoten am Ende
  25. bool del(int key); // löschen eines Knotens [key]
  26. bool search(int key); // Suchen eines Knoten
  27. bool swap(int key1, int 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);
  31. // Mit der format??Methode kann die Ausgabe gesteuert werden: operator <<
  32. List<T> & operator = (const List<T> & List); // Zuweisungsoperatorde nieren
  33. List<T> & operator = (const List<T> * List); // Zuweisungsoperatorde nieren
  34. List<T> & operator + (const List<T> & List_Append) const; // Listen zusammenfuehrenzu einer Liste
  35. List<T> & operator + (const List<T> * List_Append) const; // Listen zusammenfuehrenzu einer Liste
  36. template <typename T>
  37. friend std::ostream & operator << (std::ostream & stream, const List<T> & Liste); //Ausgabeoperator ueberladen
  38. template <typename T>
  39. friend std::ostream & operator << (std::ostream & stream, const List<T> * Liste); //Ausgabeoperator ueberladen
  40. };
  41. #endif
  42.  
  43. template <class T>
  44. List<T>::List()
  45. {
  46. head = new Node<T>;
  47. tail = new Node<T>;
  48. _size = 0;
  49. head->next = tail;
  50. tail->prev = head;
  51. }
  52. template <class T>
  53. List<T>::~List()
  54. {
  55. //( ... löschen Sie alle noch vorhandenen Knoten Node dieser Instanz
  56. // Denken Sie auch den die Knoten head und tail.)
  57. if (head)
  58. {
  59. while (head->next)
  60. {
  61. head = head->next;
  62. delete head->prev;
  63. }
  64. delete head;
  65. }
  66. }
  67. template<class T>
  68. void List<T>::InsertFront(int key)
  69. {
  70. //( ... Erweitern Sie die Methode so, dass ein neuer Knoten Node vorne
  71. // (hinter dem Knoten head) in die Liste eingefügt wird. )
  72. Node<T>* neuerKnoten = new Node<T>(key);
  73. if (head)
  74. {
  75. neuerKnoten->prev = head;
  76. neuerKnoten->next = head->next;
  77. head->next->prev = neuerKnoten;
  78. head->next = neuerKnoten;
  79. _size++;
  80. }
  81. }
  82. template<class T>
  83. void List<T>::InsertBack(int key)
  84. {
  85. //( ... Erweitern Sie die Methode so, dass ein neuer Knoten Node hinten
  86. // (vor dem Knoten tail) in die Liste eingefügt wird. )
  87. Node<T>* neuerKnoten = new Node<T>(key);
  88. if (tail)
  89. {
  90. neuerKnoten->prev = tail->prev;
  91. neuerKnoten->next = tail;
  92. tail->prev->next = neuerKnoten;
  93. tail->prev = neuerKnoten;
  94. _size++;
  95. }
  96. }
  97. template<class T>
  98. bool List<T>::getFront(int & key)
  99. {
  100. //( ... Erweitern Sie die Methode so, dass der erste Knoten der Liste
  101. // (hinter head) zurückgegeben und dieser Knoten dann gelöscht wird.
  102. // Im Erfolgsfall geben Sie true zurück, sonst false. )
  103. if (head->next)
  104. {
  105. key = head->next->key;
  106. if (head->next->next)
  107. {
  108. head->next->next->prev = head;
  109. }
  110. Node<T>* temp = head->next;
  111. head->next = head->next->next;
  112. delete temp;
  113. _size--;
  114. return true;
  115. }
  116. return false;
  117. }
  118. template<class T>
  119. bool List<T>::getBack(int & key)
  120. {
  121. //(... Erweitern Sie die Methode so, dass der letzte Knoten der Liste
  122. // (vor tail) zurückgegeben und dieser Knoten dann gelöscht wird.
  123. // Im Erfolgsfall geben Sie true zurück, sonst false. )
  124. if (tail->prev && tail->prev != head)
  125. {
  126. key = tail->prev->key;
  127. if (tail->prev->prev)
  128. {
  129. tail->prev->prev->next = tail;
  130. }
  131. Node<T>* temp = tail->prev;
  132. tail->prev = tail->prev->prev;
  133. delete temp;
  134. _size--;
  135. return true;
  136. }
  137. return false;
  138. }
  139. template<class T>
  140. bool List<T>::del(int key)
  141. {
  142. //(... Die Methode del sucht den Knoten mit dem Wert Key und löscht diesen
  143. // im Erfolgsfall aus der Liste.
  144. // Im Erfolgsfall geben Sie true zurück, sonst false. )
  145. Node<T>* searchNode = head;
  146. while (searchNode->next)
  147. {
  148. if (searchNode->key == key)
  149. {
  150. if (searchNode->prev)
  151. {
  152. searchNode->prev->next = searchNode->next;
  153. }
  154. searchNode->next->prev = searchNode->prev;
  155. delete searchNode;
  156. _size--;
  157. return true;
  158. }
  159. searchNode = searchNode->next;
  160. }
  161. return false;
  162. }
  163. template<class T>
  164. bool List<T>::search(int key)
  165. {
  166. //(... Die Methode search sucht den Knoten mit dem Wert key
  167. // Im Erfolgsfall geben Sie true zurück, sonst false. )
  168. Node<T>* searchNode = head;
  169. while (searchNode->next)
  170. {
  171. if (searchNode->key == key)
  172. {
  173. return true;
  174. }
  175. searchNode = searchNode->next;
  176. }
  177. return false;
  178. }
  179. template <class T>
  180. bool List<T>::swap(int key1, int key2)
  181. {
  182. //(... Die Methode swap sucht den Knoten mit dem Wert key1,
  183. // dann den Knoten mit dem Wert key2. Diese Knoten werden dann
  184. // getauscht, indem die Zeiger der Knoten entsprechend geändert
  185. // werden. )
  186. Node<T>* key_eins = nullptr;
  187. Node<T>* key_zwei = nullptr;
  188. Node<T>* tempNode = head->next;
  189. while (tempNode)
  190. {
  191. if (tempNode->key == key1)
  192. {
  193. key_eins = tempNode;
  194. }
  195. else if (tempNode->key == key2)
  196. {
  197. key_zwei = tempNode;
  198. }
  199. tempNode = tempNode->next;
  200. }
  201. if (key_eins && key_zwei)
  202. {
  203. Node<T> tempNode = *key_eins;
  204. if (key_eins->next)
  205. {
  206. key_eins->next->prev = key_zwei;
  207. }
  208. if (key_eins->prev)
  209. {
  210. key_eins->prev->next = key_zwei;
  211. }
  212. if (key_zwei->next)
  213. {
  214. key_zwei->next->prev = key_eins;
  215. }
  216. if (key_zwei->prev)
  217. {
  218. key_zwei->prev->next = key_eins;
  219. }
  220. key_eins->next = key_zwei->next;
  221. key_eins->prev = key_zwei->prev;
  222. key_zwei->next = tempNode.next;
  223. key_zwei->prev = tempNode.prev;
  224. return true;
  225. }
  226. return false;
  227. }
  228. template <class T>
  229. int List<T>::size(void)
  230. {
  231. //(... Die Methode git den Wert von size (Anzahl der Knoten in der Liste) zurück. )
  232. return _size;
  233.  
  234. }
  235. template <class T>
  236. bool List<T>::test(void)
  237. {
  238. //(... Die Methode überprüft die Pointer der Liste. Gestartet wird mit head. Es werden alle
  239. // Knoten bis zum tail durchlaufen von dort aus dann die prev-Zeiger bis zum head.
  240. // Bei Erfolg wird true zurück gegeben. )
  241. Node<T>* searchNode = head;
  242. while (searchNode)
  243. {
  244. if (!searchNode->next && searchNode != tail)
  245. {
  246. return false;
  247. }
  248. searchNode = searchNode->next;
  249. }
  250. //loopIndex either is tail or the function alread returned false
  251. while (searchNode)
  252. {
  253. if (!searchNode->prev && searchNode != head)
  254. {
  255. return false;
  256. }
  257. }
  258. //if none of the two while loops returned false you can return true!
  259. return true;
  260. }
  261.  
  262. // END
  263. template <class T>
  264. void List<T>::format(const std::string & start, const std::string & zwischen, const std::string & ende)
  265. {
  266. // Setzen der Formatierung für den überladenen Streamingoperator <<
  267. _form.start = start; // Ausgabe zu Beginn der Liste
  268. _form.zwischen = zwischen; // Ausgabe zwischen zwei Knoten
  269. _form.ende = ende; // Ausgabe am Ende der Liste
  270. }
  271. template<class T>
  272. List<T> & List<T>::operator = (const List<T> & _List)
  273. {
  274. // in dem Objekt _List sind die Knoten enthalten, die Kopiert werden sollen.
  275. // Kopiert wird in das Objekt "this"
  276. if (this == &_List) return *this; // !! keine Aktion notwendig
  277. Node<T>* tmp_node;
  278. if (_size)
  279. {
  280. Node<T> * tmp_del;
  281. tmp_node = head->next;
  282. while (tmp_node != tail) // Alle eventuell vorhandenen Knoten in this löschen
  283. {
  284. tmp_del = tmp_node;
  285. tmp_node = tmp_node->next;
  286. delete tmp_del;
  287. }
  288. _size = 0;
  289. head->next = tail;
  290. tail->prev = head;
  291. }
  292. tmp_node = _List.head->next;
  293. while (tmp_node != _List.tail)
  294. {
  295. InsertBack(tmp_node->key);
  296. tmp_node = tmp_node->next;
  297. }
  298. return *this;
  299. }
  300. template <class T>
  301. List<T> & List<T>::operator = (const List<T> * _List)
  302. {
  303. // in dem Objekt _List sind die Knoten enthalten, die Kopiert werden sollen.
  304. // Kopiert wird in das Objekt "this"
  305. if (this == _List) return *this; // !! keine Aktion notwendig
  306. Node<T> * tmp_node;
  307. if (_size)
  308. {
  309. Node<T> * tmp_del;
  310. tmp_node = head->next;
  311. while (tmp_node != tail) // Alle eventuell vorhandenen Knoten in this löschen
  312. {
  313. tmp_del = tmp_node;
  314. tmp_node = tmp_node->next;
  315. delete tmp_del;
  316. }
  317. _size = 0;
  318. head->next = tail;
  319. tail->prev = head;
  320. }
  321. tmp_node = _List->head->next;
  322. while (tmp_node != _List->tail)
  323. {
  324. InsertBack(tmp_node->key);
  325. tmp_node = tmp_node->next;
  326. }
  327. return *this;
  328. }
  329. template <class T>
  330. List<T> & List<T>::operator + (const List<T> & List_Append) const
  331. {
  332. List<T> * tmp = new List;
  333. Node<T> * tmp_node;
  334. tmp_node = head->next;
  335. while (tmp_node != tail) {
  336. tmp->InsertBack(tmp_node->key);
  337. tmp_node = tmp_node->next;
  338. }
  339. if (!List_Append._size) return *tmp;
  340. tmp_node = List_Append.head->next;
  341. while (tmp_node != List_Append.tail) {
  342. tmp->InsertBack(tmp_node->key);
  343. tmp_node = tmp_node->next;
  344. }
  345. return *tmp;
  346. }
  347. template <class T>
  348. List<T> & List<T>::operator + (const List<T> * List_Append) const
  349. {
  350. List<T> * tmp = new List;
  351. Node<T> * tmp_node;
  352. tmp_node = head->next;
  353. while (tmp_node != tail) {
  354. tmp->InsertBack(tmp_node->key);
  355. tmp_node = tmp_node->next;
  356. }
  357. if (!List_Append->_size) return *tmp;
  358. tmp_node = List_Append->head->next;
  359. while (tmp_node != List_Append->tail) {
  360. tmp->InsertBack(tmp_node->key);
  361. tmp_node = tmp_node->next;
  362. }
  363. return *tmp;
  364. }
  365. template <class T>
  366. std::ostream & operator<<(std::ostream & stream, List<T> const & Liste)
  367. {
  368. stream << Liste._form.start;
  369. for (Node<T> * tmp = Liste.head->next; tmp != Liste.tail; tmp = tmp->next)
  370. stream << tmp->key << (tmp->next == Liste.tail ? Liste._form.ende : Liste._form.zwischen);
  371. return stream;
  372. }
  373. template <class T>
  374. std::ostream & operator << (std::ostream & stream, List<T> const * Liste)
  375. {
  376. stream << Liste->_form.start;
  377. for (Node<T> * tmp = Liste->head->next; tmp != Liste->tail; tmp = tmp->next)
  378. stream << tmp->key << (tmp->next == Liste->tail ? Liste->_form.ende : Liste->_form.zwischen);
  379. return stream;
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement