Guest User

Untitled

a guest
May 25th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.96 KB | None | 0 0
  1. /**
  2. * @file RList.java Listenverwaltung in Form einer <b>doppelt
  3. * verketteten Ringliste</b>.
  4. *
  5. * <ul>
  6. * <li> Jedes Listenelement m ist mit einer Referenz m.n auf den
  7. * Nachfolger und einer Referenz m.p auf den Vorgänger versehen
  8. * (sog. doppelte Verkettung).
  9. * <li> Jede Liste enthält immer ein sog. <b>Ankerelement</b>.
  10. * Dieses trägt niemals
  11. * Nutzdaten (Komponente 'data' ist die null-Referenz).
  12. * <li> Die leere Liste wird allein durch das Ankerelement
  13. * repräsentiert, bei dem Nachfolger
  14. * und Vorgänger auf sich selbst zeigen.
  15. * <li> Bei einer nicht leeren Liste ist der Nachfolger
  16. * des Ankerelementes der <b>Listenkopf</b>, d.h.
  17. * das erste Nutzdaten tragende Element der Liste. Der
  18. * Vorgänger des Ankerelementes ist das <b>letzte Element</b>
  19. * der Liste. Umgekehrt hat der Listenkopf immer das
  20. * Ankerelement als Vorgänger, und das letzte Element der
  21. * Liste hat immer das Ankerelement als Nachfolger.
  22. * </ul>
  23. *
  24. * Der Vorteil einer doppelt verketteten Ringliste besteht darin,
  25. * dass Einfüge- und Löschoperationen, sowie Konkatenation
  26. * ohne spezielle Fallunterscheidungen
  27. * "Liste leer/nicht leer", "Löschen des letzten Elementes" etc.
  28. * auskommen.
  29. */
  30.  
  31. /**
  32. * Aus der Klasse Rlist werden einzelne Listenelemente instanziiert.
  33. * Gleichzeitig repräsentiert das Ankerelement der Liste die
  34. * gesamte Liste, denn vom Ankerelement aus lässt sich jedes
  35. * Listenelement erreichen.
  36. */
  37. class Rlist<T extends Comparable<T>> {
  38.  
  39. /** Jeder Listeneintrag hat ein Objekt vom Typ T als Nutzdaten.
  40. * Das Ankerelement l der Liste ist durch die Bedingung
  41. *
  42. * <code>l.data == null</code>
  43. *
  44. * eindeutig gekennzeichnet.
  45. */
  46. private T data;
  47.  
  48. /** Referenz auf das Nachfolger-Listenelement */
  49. private Rlist<T> n;
  50.  
  51. /** Referenz auf das Vorgänger-Listenelement */
  52. private Rlist<T> p;
  53.  
  54. /**
  55. * Konstruktor Rlist() erzeugt eine neue leere
  56. * Liste.
  57. *
  58. * @return Korrekt initialisiertes Ankerelement und damit
  59. * eine leere Liste, die allein durch das Ankerelement
  60. * repräsentiert ist.
  61. */
  62. public Rlist() {
  63. data = null;
  64. n = this;
  65. p = this;
  66. }
  67.  
  68.  
  69.  
  70. /**
  71. * Methode isEmpty() prüft, ob eine Liste
  72. * leer ist.
  73. *
  74. *
  75. * @return Gibt genau dann true zurück, wenn die Liste leer ist,
  76. * d.h. wenn Vorgänger und Nachfolger wieder
  77. * auf das Listenelement zeigen, auf dem empty()
  78. * aufgerufen wird: Damit ist nachgewiesen, dass
  79. * die Liste allein aus dem Ankerelement besteht.
  80. *
  81. */
  82. public boolean isEmpty() {
  83.  
  84. return data == null && n == this && p == this;
  85.  
  86.  
  87. }
  88.  
  89.  
  90. /**
  91. * Methode size() berechnet die Länge
  92. * einer Liste. Das Ankerelement wird
  93. * dabei <b>nicht</b> mit gezählt.
  94. *
  95. * @return Anzahl der Listenelemente,
  96. * abzüglich des Ankerelements.
  97. *
  98. * @note Wegen der Ringverkettung kann die Methode auf ein
  99. * beliebiges Listenelement aufgerufen werden.
  100. * Die Zählung endet, wenn bei der Traversion der List wieder
  101. * das Ursprungselement erreicht wurde.
  102. *
  103. */
  104. public int size() {
  105.  
  106. int s = 0;
  107. Rlist<T> e = this;
  108. do {
  109. s++;
  110. e = e.n;
  111. e.p = e;
  112. } while (e != this);
  113. return s-1;
  114. }
  115.  
  116. /**
  117. * Methode clear() löscht den Listeninhalt, so dass
  118. * die leere Liste zurück bleibt.
  119. * Diese Methode darf nur auf das Ankerelement aufgerufen
  120. * werden.
  121. *
  122. */
  123. public void clear() {
  124.  
  125. if (data == null){
  126. p.n = p;
  127. n.p = n;
  128. n = this;
  129. p = this;
  130. }
  131.  
  132. }
  133.  
  134. /**
  135. * Methode add() fügt ein neues Listenelement
  136. * <b>hinter</b> dem Element ein, auf welchem
  137. * die Methode aufgerufen wurde.
  138. *
  139. * @param d Einzufügendes Nutzdatenobjekt.
  140. *
  141. * @note Die Operation lässt sich ohne ein
  142. * einziges if-statement realisieren.
  143. *
  144. * @note add(null) ist nicht zulässig,
  145. * weil ansonsten das Ankerelement nicht eindeutig
  146. * bestimmbar wäre.
  147. *
  148. */
  149. public void add(T d) {
  150.  
  151. Rlist<T> x = new Rlist<T>();
  152. x.data = d;
  153. x.n = this.n;
  154. this.n = x;
  155. x.p = this.p;
  156. this.p = x;
  157.  
  158.  
  159. }
  160.  
  161. /**
  162. * Methode insert() fügt ein neues Listenelement
  163. * <b>vor</b> demjenigen ein, auf welchem die Operation
  164. * aufgerufen wird.
  165. *
  166. * @param d Nutzdaten für das neu
  167. * anzulegende Listenelement.
  168. *
  169. * @note Die Operation lässt sich ohne ein
  170. * einziges if-statement realisieren.
  171. *
  172. * @note insert(null) ist nicht zulässig,
  173. * weil ansonsten das Ankerelement nicht eindeutig
  174. * bestimmbar wäre.
  175. */
  176. public void insert(T d) {
  177.  
  178.  
  179.  
  180. }
  181.  
  182.  
  183. /**
  184. * Methode get() gibt den Inhalt (Nutzdaten) des
  185. * Listenelements zurück, auf dem die Operation
  186. * aufgerufen wird.
  187. *
  188. * @return Referenz auf die Nutzdaten (kann null sein,
  189. * falls es sich um das Ankerelement handelt)
  190. *
  191. */
  192. public T get() {
  193. return data;
  194. }
  195.  
  196. /**
  197. * Methode next() gibt die Referenz auf
  198. * den Nachfolger des Listenelements l zurück,
  199. * auf dem die Methode aufgerufen wird.
  200. *
  201. * @return Nachfolger l.n von l.
  202. *
  203. */
  204. public Rlist<T> next() {
  205.  
  206. return n;
  207. }
  208.  
  209. /**
  210. * Methode prev() gibt die Referenz auf
  211. * den Vorgänger des Listenelements l zurück, auf dem
  212. * die Methode aufgerufen wird.
  213. *
  214. * @return Vorgänger l.p von l.
  215. *
  216. */
  217. public Rlist<T> prev() {
  218.  
  219.  
  220.  
  221. return p;
  222. }
  223.  
  224. /**
  225. * Methode find() sucht nach einem Listenelement l,
  226. * welches ein vorgegebenes Nutzdatenelement enthält,
  227. * und gibt die Referenz auf dieses Element l zurück,
  228. * falls vorhanden.
  229. *
  230. * @param d Nutzdatenobjekt, das unter den Listenelementen
  231. * gesucht werden soll.
  232. * @return null, falls d bei keinem Element als Nutzdaten
  233. * eingetragen ist.
  234. * @return Referenz auf das erste gefundene Listenelement sonst.
  235. *
  236. * @note Zum Vergleich der Nutzdaten wird die Methode equals()
  237. * verwendet.
  238. */
  239. public Rlist<T> find(T d) {
  240.  
  241.  
  242.  
  243. return null;
  244. }
  245.  
  246.  
  247.  
  248. /**
  249. * Methode remove() löscht das Listenelement aus der Liste,
  250. * auf welchem die Methode aufgerufen wurde.
  251. * Wirkungslos, wenn auf dem Ankerelement aufgerufen.
  252. *
  253. *
  254. * @note Diese Operation benötigt eine if-Abfrage.
  255. * Warum?
  256. */
  257. public void remove() {
  258.  
  259. if (data != null){
  260. p.n = n;
  261. n.p = p;
  262. n = this;
  263. p = this;
  264. }
  265.  
  266. }
  267.  
  268.  
  269. /**
  270. * Methode toString() gibt den Nutzdateninhalt der Liste als String zurück.
  271. *
  272. * Der String ist eine durch spitze Klammern eingefasste und durch Komma
  273. * separierte Auflistung der einzelnen Nutzdaten in der entsprechenden
  274. * Reihenfolge. Die einzelnen Elemente werden selbst wieder mit der
  275. * Methode toString() formatiert.
  276. * Beispielrückgabe: "<1, 2, 4, 3>"
  277. *
  278. * Diese Methode darf nur auf das Ankerelement aufgerufen
  279. * werden.
  280. *
  281. * @return Der String.
  282. */
  283. public String toString() {
  284.  
  285. String inhalt = "<";
  286.  
  287. if (data == null){
  288.  
  289. Rlist l = this;
  290.  
  291. do {
  292.  
  293. inhalt = inhalt + l.get() + ", ";
  294. l.next();
  295.  
  296. } while (l.data != null);
  297.  
  298. }
  299.  
  300. inhalt = inhalt + ">";
  301. return inhalt;
  302. }
  303.  
  304.  
  305. /**
  306. * Methode equals() vergleicht zwei Listen auf
  307. * inhaltliche Gleichheit.
  308. *
  309. * Diese Methode darf nur auf das Ankerelement aufgerufen
  310. * werden.
  311. *
  312. * @param o Referenz auf Ankerelement der zweiten Liste.
  313. * Die Liste darf leer sein.
  314. *
  315. * @return false, wenn o nicht vom Typ RList ist.
  316. * @return false, wenn die Listen unterschiedliche Länge haben.
  317. * @return false, wenn sich die Listen bei mindestens einem Element
  318. * in den Nutzdaten unterscheiden.
  319. * @return true, falls die Listen dieselbe Länge, dieselben
  320. * Nutzdaten und dieselbe Sortierung besitzen.
  321. */
  322. @Override
  323. public boolean equals(Object o) {
  324.  
  325.  
  326. if (!(o instanceof Rlist)){
  327. return false;
  328. }
  329.  
  330. Rlist lAux = (Rlist) o;
  331. Rlist l = this;
  332.  
  333. if (data == null && lAux.data == null){
  334.  
  335. if (size() != lAux.size()){
  336. return false;
  337. }
  338.  
  339. for (l = l.n, lAux = lAux.n; l.p.data == null; l = l.next(), lAux = lAux.next() ) {
  340. if (! l.get().equals(lAux.get()) ){
  341. return false;
  342. }
  343. }
  344.  
  345. }
  346. return true;
  347. }
  348.  
  349.  
  350. /**
  351. * Methode addSorted() fügt das Element d in die Liste
  352. * ein, so dass eine vorher aufsteigend sortierte Liste
  353. * nach Ausführung von addSorted() immer noch aufsteigend
  354. * sortiert ist.
  355. * Diese Methode darf nur auf das Ankerelement aufgerufen
  356. * werden.
  357. *
  358. * @param d Das einzufügende Element.
  359. *
  360. * @note Nutzdaten werden mit der Funktion compareTo() verglichen.
  361. */
  362. public void addSorted(T d) {
  363.  
  364.  
  365.  
  366. }
  367.  
  368. /**
  369. * Methode isSorted() überprüft, ob die Liste aufsteigend
  370. * sortiert ist. Diese Methode darf nur auf das
  371. * Ankerelement aufgerufen werden.
  372. *
  373. * @return Gibt genau dann true zurück, wenn die Liste sortiert ist.
  374. *
  375. * @note Nutzdaten werden mit der Funktion compareTo() verglichen.
  376. */
  377. public boolean isSorted() {
  378.  
  379.  
  380.  
  381. return false;
  382. }
  383. }
Add Comment
Please, Sign In to add comment