Guest User

Untitled

a guest
May 20th, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.86 KB | None | 0 0
  1. /*
  2. (c) 2018 Ringo Hoffmann
  3. SimpleLinkedList v.0.4.0
  4. */
  5.  
  6. #include <iostream>
  7.  
  8. using namespace std;
  9.  
  10. // Nur um eine Exception throwen zu können, wenn ein Index
  11. // angegeben wurde, welcher nicht in dem Rahmen der Liste
  12. // ist.
  13. class IndexOutOfBoundsException : public exception {
  14. virtual const char* what() const throw() {
  15. return "Specified index of element in list is out of bounds.";
  16. }
  17. };
  18.  
  19.  
  20. struct Element {
  21. int val;
  22. Element *next;
  23. };
  24.  
  25.  
  26. class List {
  27.  
  28. public:
  29. /**
  30. Constructor für liste.
  31. Erzeugt eine neue, leere liste mit dem ersten
  32. Element als Nullpointer.
  33. */
  34. List() {
  35. m_start = 0;
  36. }
  37. /**
  38. Constructor für Liste.
  39. Erzegt eine Liste der Länge 1 mit dem Argument
  40. als ersten Wert.
  41.  
  42. @param val Wert des ersten Elements.
  43. */
  44. List(int val) {
  45. m_start = new Element { val, 0 };
  46. ++m_len;
  47. }
  48.  
  49. /**
  50. Constructor für Liste.
  51. Erzeugt eine Liste der Länge angegebener Elemente
  52. übergeben in einem Array von Elementen.
  53.  
  54. @param val Array der Elemente zum Hinzufügen
  55. @param size Größe des Arrays
  56. */
  57. List(int *val, int size) {
  58. m_start = new Element { val[0], 0 };
  59. Element *curr = m_start;
  60. for (int i = 1; i < size; i++) {
  61. curr->next = new Element { val[i], 0 };
  62. curr = curr->next;
  63. }
  64. m_len += size;
  65. }
  66.  
  67. /**
  68. Gibt die Länge der Liste wieder.
  69.  
  70. @returns Länge der Liste.
  71. */
  72. int len() {
  73. return m_len;
  74. }
  75.  
  76. /**
  77. Erzeugt einen Debug-Konsolenoutput mit
  78. allen Elementen der Liste, ihren Adressen und
  79. den Adressen, auf welche jedes Element verweist.
  80. */
  81. void output() {
  82. Element *curr = m_start;
  83. int i = 0;
  84.  
  85. while (curr != 0) {
  86. cout << i++ << " - [" << curr << "->" << curr->next
  87. << "] - " << curr->val << endl;
  88. curr = curr->next;
  89. }
  90. cout << endl << "LEN: " << len() << endl;
  91. cout << "------------------------" << endl;
  92. }
  93.  
  94. /**
  95. Ein Element an das Ende der Liste anfügen.
  96.  
  97. @param val Anzufügendes Element
  98. */
  99. void push(int val) {
  100. Element *curr = m_start;
  101.  
  102. while (curr->next != 0)
  103. curr = curr->next;
  104.  
  105. curr->next = new Element { val, 0 };
  106. ++m_len;
  107. }
  108.  
  109. /**
  110. Fügt alle Werte eines übergebenen Arrays an
  111. das Ende der Liste an.
  112.  
  113. @param val Array der anzufügenden Elemente.
  114. @param size Länge des Arrays.
  115. */
  116. void push(int *val, int size) {
  117. Element *curr = m_start;
  118.  
  119. while (curr->next != 0)
  120. curr = curr->next;
  121.  
  122. for (int i = 0; i < size; i++) {
  123. curr->next = new Element { val[i], 0 };
  124. curr = curr->next;
  125. }
  126.  
  127. m_len += size;
  128. }
  129.  
  130. /**
  131. Entfernt und gibt das letzte Element der
  132. Liste wieder.
  133.  
  134. @returns Wert des letzten Elements der Liste.
  135. */
  136. int pop() {
  137. Element *curr = m_start;
  138. int out = 0;
  139. if (curr->next != 0) {
  140. while (curr->next->next != 0)
  141. curr = curr->next;
  142. out = curr->next->val;
  143. delete curr->next;
  144. curr->next = 0;
  145. }
  146. else {
  147. out = curr->val;
  148. m_start = 0;
  149. }
  150.  
  151. --m_len;
  152. return out;
  153. }
  154.  
  155. /**
  156. Gibt den Wert des Elements mit dem angegebenen
  157. Index wieder.
  158.  
  159. @param index Index des auszulesenden Wertes
  160. @returns Wert des Elements
  161. */
  162. int get(int index) {
  163. Element *curr = m_start;
  164. int i = 0;
  165.  
  166. if (index >= m_len || index < 0)
  167. throw IndexOutOfBoundsException();
  168.  
  169. while (curr->next != 0 && i++ < index)
  170. curr = curr->next;
  171.  
  172. return curr->val;
  173. }
  174.  
  175. /**
  176. Fügt ein Element an einer beliebigen Stelle in
  177. in der Liste ein.
  178.  
  179. @param index Stelle des einzufügenden Elements.
  180. @param val Wert des einzufügenden Elements.
  181. */
  182. void insert(int index, int val) {
  183. Element *curr = m_start;
  184. int i = 0;
  185.  
  186. if (index > m_len || index < 0)
  187. throw IndexOutOfBoundsException();
  188.  
  189. if (index == 0) {
  190. m_start = new Element { val, m_start };
  191. return;
  192. }
  193.  
  194. while (curr->next != 0 && ++i < index)
  195. curr = curr->next;
  196.  
  197. curr->next = new Element { val, curr->next };
  198. --m_len;
  199. }
  200.  
  201. /**
  202. Fügt alle Elemente eines Arrays in einer
  203. beliebigen Stelle in der Liste ein.
  204.  
  205. @param index Stelle, an der die Elemente
  206. eingefügt werden sollen.
  207. */
  208. void insert(int index, int *val, int size) {
  209. Element *curr = m_start, *tmp;
  210. int i = 0;
  211.  
  212. if (index > m_len || index < 0)
  213. throw IndexOutOfBoundsException();
  214.  
  215. if (index == 0) {
  216. tmp = m_start;
  217. m_start = new Element { val[0], 0 };
  218. curr = m_start;
  219. for (int i = 1; i < size; i++) {
  220. curr->next = new Element { val[i], 0 };
  221. curr = curr->next;
  222. }
  223. curr->next = tmp;
  224. }
  225. else {
  226. for (int i = 0; i < index - 1; i++)
  227. curr = curr->next;
  228.  
  229. tmp = new Element { curr->next->val, curr->next->next };
  230.  
  231. for (int i = 0; i < size; i++) {
  232. curr->next = new Element { val[i], 0 };
  233. curr = curr->next;
  234. }
  235.  
  236. curr->next = tmp;
  237. m_len += size;
  238. }
  239. }
  240.  
  241. /**
  242. Entfernt einen Wert an einer beliebigen Stelle in
  243. der Liste.
  244.  
  245. @param index Stelle des zu entfernenden Elements.
  246. */
  247. void remove(int index) {
  248. Element *curr = m_start;
  249. int i = 0;
  250.  
  251. if (index >= m_len || index < 0)
  252. throw IndexOutOfBoundsException();
  253.  
  254. if (index == 0 && m_len == 1) {
  255. m_start = 0;
  256. return;
  257. }
  258.  
  259. if (index == m_len - 1) {
  260. pop();
  261. return;
  262. }
  263.  
  264. while (curr->next != 0 && ++i < index)
  265. curr = curr->next;
  266.  
  267. if (curr->next != 0) {
  268. if (curr->next->next != 0)
  269. curr->next = curr->next->next;
  270. }
  271.  
  272. --m_len;
  273. }
  274.  
  275. /**
  276. Ändert den Wert eines Elements an einer
  277. beliebigen Stelle.
  278.  
  279. @param index Index des zu ändernden Elements
  280. @param val Neuer Wert des Elements
  281. */
  282. void change(int index, int val) {
  283. Element *curr = m_start;
  284.  
  285. if (index >= m_len || index < 0)
  286. throw IndexOutOfBoundsException();
  287.  
  288. for (int i = 0; i < index; i++)
  289. curr = curr->next;
  290.  
  291. curr->val = val;
  292. }
  293.  
  294. /**
  295. Tauscht die Werte zweier Elemente via der
  296. Angegebenen Indizes.
  297.  
  298. @param i1 Index des ersten Elements.
  299. @param i2 Index des zweiten Elements.
  300. */
  301. void swap(int i1, int i2) {
  302. int v1 = get(i1);
  303. int v2 = get(i2);
  304. change(i2, v1);
  305. change(i1, v2);
  306. }
  307.  
  308.  
  309. private:
  310. // Startelement (Ankerelemenet)
  311. Element *m_start;
  312. // Länge der Liste
  313. int m_len = 0;
  314. };
  315.  
  316. int main() {
  317.  
  318. List l(new int[5] {0, 1, 2, 3, 4}, 5);
  319. //l.insert(2, new int[3] {11, 12, 13}, 3);
  320. //l.insert(3, 99);
  321. //l.output();
  322. //l.swap(1,3);
  323. l.output();
  324. }
Add Comment
Please, Sign In to add comment