class Zelle{ Object inhalt; Zelle next; Zelle(Object el){ inhalt = el;} Zelle(Object el, Zelle z){ inhalt = el; next = z;} } abstract class BesucherKlasse{ abstract void f(Object e); } class Zaehler extends BesucherKlasse{ private int anzahl=0; void f(Object e) { anzahl++; } int getAnzahl(){return anzahl;} } class Drucker extends BesucherKlasse{ void f(Object e) { System.out.print(e); } } class Liste{ private Zelle anfang; private Zelle cursor; boolean istLeer(){ return anfang == null;} int laenge(){ Zelle cur = anfang; int l = 0; while (cur != null) { l++; cur = cur.next; } return l; } boolean istGueltigePosition(int p){ return (p >= 1) && (p <= laenge() ); } void setzeCursor(int p){ cursor = null; if (istGueltigePosition(p) ){ Zelle cur = anfang; for (int i = 1; i < p; i++) cur = cur.next; cursor = cur; } } void initCursor(){ cursor = anfang; } int suche(Object e){ cursor = null; int p = 0; Zelle z = anfang; int l = 0; while (z != null){ l++; if ( z.inhalt == e ) { p = l; cursor = z; break; } z = z.next; } return p; } void einsetzenNach(int p, Object e){ setzeCursor(p); if (cursor != null){ Zelle z = new Zelle(e, cursor.next); cursor.next = z; } } void einsetzenVor(int p, Object e){ if (p > 1) einsetzenNach(p-1, e); else { // Einsetzen am Anfang Zelle z = new Zelle(e, anfang); anfang = z; } } void loesche(int p){ if (istGueltigePosition(p)){ if (p == 1) // Lösche 1. Object anfang = anfang.next; else { setzeCursor(p-1); cursor.next = cursor.next.next; } } } Object inhalt(int p){ setzeCursor(p); if (cursor == null) return null; return cursor.inhalt; } Object naechstes(){ if (cursor == null) return null; Object e = cursor.inhalt; cursor = cursor.next; return e; } void forEach(BesucherKlasse besucher){ cursor = anfang; while(cursor != null) besucher.f(naechstes()); } } class StackFehler extends Exception{ public StackFehler(){super();} public StackFehler(String s){super(s);} } class Stack extends Liste{ void push (Object e){ einsetzenVor(1, e); } void pop () throws StackFehler { if (istLeer()) throw new StackFehler("StackFehler: Zugriff auf leeren Stack !"); loesche(1); } Object top () throws StackFehler { if (istLeer()) throw new StackFehler("StackFehler: Zugriff auf leeren Stack !"); return inhalt(1); } Object popTop () throws StackFehler { Object e = top(); pop(); return e; } } public class ListeT { public static void main(String args[]) { System.out.println("Listen Tester - Test 1"); System.out.println(""); String beispiel = "BEISPIEL"; int l = beispiel.length(); Liste meineListe = new Liste(); for (int i = 0; i < l; i++){ char c =beispiel.charAt(i); System.out.print(c); Object eo = new Character(c); meineListe.einsetzenVor(i+1, eo); } System.out.println(); Zaehler z = new Zaehler(); meineListe.forEach(z); System.out.println("Test Zahler"); System.out.println(z.getAnzahl()); Drucker d = new Drucker(); System.out.println("Test Drucker"); meineListe.forEach(d); System.out.println(); System.out.println("Listen Tester - Test 2"); meineListe = new Liste(); for (int i = 0; i < l; i++){ char c =beispiel.charAt(i); System.out.print(c); Object eo = new Character(c); meineListe.einsetzenVor(1, eo); } System.out.println(); z = new Zaehler(); meineListe.forEach(z); System.out.println("Test Zahler"); System.out.println(z.getAnzahl()); d = new Drucker(); System.out.println("Test Drucker"); meineListe.forEach(d); System.out.println(); System.out.println(""); System.out.println("Listen Tester - Test 3"); System.out.println(""); Stack meinStack = new Stack(); for (int i = 0; i < l; i++){ char c =beispiel.charAt(i); System.out.print(c); Object ec = new Character(c); meinStack.push(ec); } System.out.println(); try { for (int i = 0; i < l; i++){ Object ec = meinStack.popTop(); System.out.print(ec); } System.out.println(); } catch(StackFehler s){System.out.println(s);} } }