Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.44 KB | None | 0 0
  1.  
  2. #ifndef LINKEDLIST_H_
  3. #define LINKEDLIST_H_
  4.  
  5. #include "Iterator.h"
  6. #include "Element.h"
  7. #include <iostream>
  8.  
  9. namespace fhdo_pk2{
  10.  
  11. template <class T>
  12. class LinkedList{
  13. private:
  14. element<T>* anfang;
  15. element<T>* ende;
  16. int laenge;
  17.  
  18. //Innere Klasse--------------------------------------------------------
  19. class ListIterator: public Iterator<T>{
  20.  
  21. private:
  22. element<T>* pointer;
  23.  
  24. public:
  25. ListIterator(element<T>* anfang){
  26. pointer = new element<T>();
  27. pointer->nachfolger = anfang;
  28. }
  29.  
  30. bool hasNext(){
  31. return (pointer->nachfolger != nullptr);
  32. }
  33.  
  34. T next(){
  35. pointer = pointer->nachfolger;
  36. return pointer->inhalt;
  37. }
  38. };
  39. //Innere Klasse Ende---------------------------------------------------
  40.  
  41. public:
  42. /* Erzeugt eine leere Liste. */
  43. LinkedList();
  44.  
  45. /* Copy Konstruktor */
  46. LinkedList( LinkedList& orig);
  47.  
  48. /* Löscht die Liste */
  49. ~LinkedList();
  50.  
  51. /* Fuegt den Text (in konstanter Zeit) an der letzten */
  52. /* Listenposition hinzu. */
  53. /* Liefert den Wert 1, wenn das Element eingefuegt werden */
  54. /* konnte. Ansonsten wird der Wert 0 geliefert. */
  55. int append( T text);
  56.  
  57. /* Fuegt ein neues Element an der Position p ein. */
  58. /* Das erste Element der Liste befindet sich an der */
  59. /* Position 0. */
  60. /* Das Element, das sich aktuell an der Position p befindet,*/
  61. /* wird nach rechts geschoben. */
  62. /* Falls sich weniger als p Elemente in der Liste befinden, */
  63. /* wird der Text am Ende angefuegt. */
  64. int insert( T text, int p);
  65.  
  66. /* Loescht das Element an der Position p. Das erste */
  67. /* Element befindet sich an der Position 0. */
  68. /* Falls das p-te Element nicht existiert, wird das letzte */
  69. /* Element geloescht. Die Anzahl der geloeschten Elemente */
  70. /* wird als Funktionswert geliefert. */
  71. int remove(int p);
  72.  
  73. /* Liefert den Text an der p-ten Listenposition. */
  74. /* Das erste Listenelement befindet sich an der Position 0. */
  75. /* Falls das p-te Element nicht existiert, wird nullptr */
  76. /* geliefert.*/
  77. T get(int p);
  78.  
  79.  
  80. /* Berechnet den Index des ersten Elements, das den Text */
  81. /* text enthaelt. Falls kein Element den gesuchten Text */
  82. /* enthaelt, wird -1 geliefert. */
  83. //int index_of( T text);
  84.  
  85. /* Liefert den Text des ersten Elements der Liste (in */
  86. /* konstanter Zeit). */
  87. // T first();
  88.  
  89. /* Liefert den Text des letzten Elements der Liste (in */
  90. /* konstanter Zeit). */
  91. // T last();
  92.  
  93.  
  94. /* Besucht alle Elemente der Liste und ruft fuer jedes */
  95. /* Element die Funktion work auf. */
  96. void visit_all(void (*work)( T t));
  97.  
  98. /* Iterator */
  99. Iterator<T>* iterator();
  100.  
  101. };
  102. }
  103.  
  104. #endif
  105.  
  106. using namespace fhdo_pk2;
  107.  
  108. template <class T>
  109. Iterator<T>* LinkedList<T>::iterator(){
  110. return new ListIterator(this->anfang);
  111. }
  112.  
  113. template <class T>
  114. LinkedList<T>::LinkedList()
  115. {
  116. anfang = nullptr;
  117. ende = nullptr;
  118. laenge = 0;
  119. }
  120.  
  121. template <class T>
  122. LinkedList<T>::LinkedList( LinkedList& orig) : LinkedList() {
  123. element<T>* p = orig.anfang;
  124. while(p != nullptr)
  125. {
  126. this->append(p->inhalt);
  127. p = p->nachfolger;
  128. }
  129. }
  130.  
  131. template <class T>
  132. LinkedList<T>::~LinkedList()
  133. {
  134. int zaehler = 0;
  135. element<T>* az = anfang;
  136. element<T>* p = anfang;
  137. while(p != nullptr)
  138. {
  139. p = p->nachfolger;
  140. delete(az);
  141. az = p;
  142. zaehler++;
  143. }
  144. std::cout << "Liste gelöscht: " << zaehler << " Elemente!" << std::endl;
  145.  
  146.  
  147. }
  148.  
  149. template <class T>
  150. int LinkedList<T>::append( T text)
  151. {
  152. //Neues Element erzeugen
  153. element<T> *neu = new element<T>();
  154. neu->inhalt = text;
  155.  
  156.  
  157. //wenn Liste leer
  158. if ((anfang == nullptr) || (ende==nullptr))
  159. {
  160. //neuen Anfang setzen
  161. anfang=neu;
  162. neu->vorgaenger = nullptr;
  163. neu->nachfolger = nullptr;
  164. }
  165. //wenn Liste nicht leer
  166. else
  167. {
  168. neu->nachfolger = nullptr;
  169. neu->vorgaenger = ende;
  170. ende->nachfolger = neu;
  171. }
  172. //in jedem Fall neues Ende setzen
  173. ende=neu;
  174. //Länge der Liste erhöhen
  175. laenge++;
  176. return 1;
  177. }
  178.  
  179. template <class T>
  180. int LinkedList<T>::insert( T text, int p)
  181. {
  182. //SONDERFALL
  183. //Wenn Liste leer
  184. if ((anfang == nullptr) && (ende==nullptr)) return -1;
  185. //wenn P außerhalb der Liste bzw am Ende liegt, automatisch am Ende anhängen
  186. if (p<0 || p>=laenge) return append(text);
  187. //----------------------------------------------------------------------------
  188.  
  189. //STANDARDFALL
  190. //neues Element erzeugen
  191. element<T> *neu = new element<T>();
  192. //Inhalt des neuen Elements setzen
  193. neu->inhalt = text;
  194. //Wenn am Anfang eingefügt werden soll
  195. if (p == 0)
  196. {
  197. neu->nachfolger = anfang;
  198. neu->vorgaenger = nullptr;
  199. anfang->vorgaenger = neu;
  200. anfang = neu;
  201. }
  202. //Wenn nicht am Anfang und nicht am Ende eingefügt werden soll
  203. else
  204. {
  205. //Zeiger auf Einfügeposition setzen
  206. element<T> *az = anfang;
  207. for(int i = 0; i<p; i++)
  208. {
  209. az = az->nachfolger;
  210. }
  211. //Zeiger entsprechend umsetzen
  212. neu->nachfolger =az;
  213. neu->vorgaenger = az->vorgaenger;
  214. az->vorgaenger->nachfolger=neu;
  215. az->vorgaenger = neu;
  216. }
  217. //Länge erhöhen
  218. laenge++;
  219. return 1;
  220. }
  221.  
  222. template <class T>
  223. int LinkedList<T>::remove(int p)
  224. {
  225. //SONDERFALL
  226. //Wenn Liste leer
  227. if ((anfang == nullptr) && (ende==nullptr)) return -1;
  228. //Wenn P nicht innerhalb der Liste liegt, wird das letzte Element gelöscht
  229. if (p<0 || p>laenge-1) return remove(laenge-1);
  230. //----------------------------------------------------------------------------
  231. //STANDARDFALL
  232. //Zeiger auf Löschposition setzen
  233. element<T>* az = anfang;
  234. for(int i = 0;i<p;i++)
  235. {
  236. az = az->nachfolger;
  237. }
  238. //Wenn Ende gelöscht werden soll
  239. if (az == ende)
  240. {
  241. ende=az->vorgaenger;
  242. ende->nachfolger = nullptr;
  243. }
  244. //Wenn Anfang gelöscht werden soll
  245. else if (az == anfang)
  246. {
  247. anfang = anfang->nachfolger;
  248. anfang->vorgaenger = nullptr;
  249. }
  250. //Wenn nicht Ende und nicht Anfang gelöscht werden soll
  251. else
  252. {
  253. az->vorgaenger->nachfolger = az->nachfolger;
  254. az->nachfolger->vorgaenger = az->vorgaenger;
  255. }
  256. //Element löschen
  257. delete az;
  258. //Länge der Liste verringern
  259. laenge--;
  260. return 1;
  261. }
  262.  
  263. template <class T>
  264. T LinkedList<T>::get(int p)
  265. {
  266. //SONDERFALL
  267. //Wenn Liste leer
  268. if ((anfang == nullptr) && (ende==nullptr)) return nullptr;
  269. //Wenn P nicht innerhalb der Liste liegt
  270. if (p<0 || p>laenge-1) return nullptr;
  271. //----------------------------------------------------------------------------
  272.  
  273. //STANDARDFALL
  274. //Zeiger auf Position p setzen
  275. element<T>* az = anfang;
  276. for(int i = 0;i<p;i++)
  277. {
  278. az = az->nachfolger;
  279. }
  280. //Inhalt an der Position des Zeigers zurückgeben
  281. return az->inhalt;
  282. }
  283.  
  284. /*
  285. template <class T>
  286. int LinkedList<T>::index_of( T text)
  287. {
  288. //SONDERFALL
  289. //Wenn Liste leer
  290. if ((anfang == nullptr) && (ende==nullptr)) return -1;
  291. //----------------------------------------------------------------------------
  292.  
  293. //STANDARDFALL
  294. //Liste durchlaufen und nach "text" suchen.
  295. element<T>* az = anfang;
  296. for(int i = 0;i<laenge;i++)
  297. {
  298. //Falls "text" gefunden, Position zurückgeben
  299. if (az->inhalt == text) return i;
  300. //Zeiger einen weiter setzen.
  301. az = az->nachfolger;
  302. }
  303. //-1 falls in gesamter Liste "text" nicht gefunden wurde
  304. return -1;
  305. }
  306.  
  307.  
  308. template <class T>
  309. T LinkedList<T>::first()
  310. {
  311. //Wenn Liste leer
  312. if (anfang == nullptr) return nullptr;
  313. //STANDARDFALL
  314. return anfang->inhalt;
  315. }
  316.  
  317. template <class T>
  318. T LinkedList<T>::last()
  319. {
  320. //Wenn Liste leer
  321. if (ende == nullptr) return nullptr;
  322. //STANDARDFALL
  323. return ende->inhalt;
  324. }
  325. */
  326.  
  327. template <class T>
  328. void LinkedList<T>::visit_all(void (*work)( T t))
  329. {
  330. Iterator<T>* it = iterator();
  331. while(it->hasNext())
  332. {
  333. work(it->next());
  334. }
  335. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement