/** * Eine Warteschlange aus Piktogrammen. * Realisiert mit einer Liste von Knoten. * * @author Q11 * @version 2013-10-11 */ public class Schlange { private Knoten ersterKnoten; /** * Konstruktor. * Erzeuge eine leere Schlange. */ public Schlange() { ersterKnoten = null; } /** * Nächster Kunde. * Nimm den vordersten Kunde aus der Schlange und rücke auf. * Gib den Kunden als Rückgabewert. * Falls die Schlange leer ist, gib null zurück. */ public Person naechsterKunde () { /* * Wir geben am Ende die erste Person der Schlange aus, sofern sie * existiert. */ Person ausgabe; /* * Falls niemand in der Schlange steht ... */ if (null == ersterKnoten) { /* * ... gib null aus, ... */ ausgabe = null; } /* * ... ansonsten ... */ else { /* * ... gib die Person im ersten Knoten. */ ausgabe = ersterKnoten.gibInhalt (); ausgabe.macheUnsichtbar (); /* * Der Nachfolger des ersten Knotens wird neuer erster Knoten. */ ersterKnoten = ersterKnoten.gibNachfolger (); /* * Wir müssen jetzt alle Personen der Schlange aufrücken. */ Knoten aktuellerKnoten = ersterKnoten; while (aktuellerKnoten != null) { aktuellerKnoten.verschiebeNachLinks (); aktuellerKnoten = aktuellerKnoten.gibNachfolger (); } } return ausgabe; } /** * Neuer Kunde. * Füge gemäß den Parametern einen neuen Kunden an die Schlange an. */ public void neuerKunde (boolean weiblich, String name, String hautfarbe, String haarfarbe, String schuhfarbe, String kleiderfarbe1, String kleiderfarbe2, String kleiderfarbe3) { int positionX = 0; Knoten aktuellerKnoten = ersterKnoten; if (ersterKnoten == null) { ersterKnoten = new Knoten (positionX, 30, weiblich, name, hautfarbe, haarfarbe, schuhfarbe, kleiderfarbe1, kleiderfarbe2, kleiderfarbe3); } else { /* * Durchlaufe die Liste, solange der aktuelle Knoten noch einen * Nachfolger hat. Verändere dabei die Zeichenposition. */ positionX = 100; while (aktuellerKnoten.gibNachfolger () != null) { aktuellerKnoten = aktuellerKnoten.gibNachfolger (); positionX += 100; } /* * Jetzt hat der aktuelle Knoten keinen Nachfolger mehr. (Wir sind am * Listenende.) Sein Nachfolger wird jetzt der neue Knoten. */ aktuellerKnoten.setzeNachfolger ( new Knoten (positionX, 30, weiblich, name, hautfarbe, haarfarbe, schuhfarbe, kleiderfarbe1, kleiderfarbe2, kleiderfarbe3)); } } /** * Entferne. * Lösche den ersten Kunden mit dem Namen "name" aus der Schlange. * Falls kein Kunde dieses Namens ansteht, gib 0 zurück. */ public Person loesche (String name) { Person ausgabe = null; Knoten aktuellerKnoten = ersterKnoten; boolean gefunden = false; /* * Solange wir nicht am Ende der Schlange sind und noch nicht die * Person gefunden haben ... */ while (aktuellerKnoten != null && !gefunden) { /* * Wenn die Person im aktuellen Knoten den gesuchten Namen hat ... */ if (aktuellerKnoten.gibInhalt ().gibName ().equals (name)) { /* * ... haben wir die Person gefunden und merken sie zum Ausgeben * vor. */ ausgabe = aktuellerKnoten.gibInhalt (); gefunden = true; } aktuellerKnoten = aktuellerKnoten.gibNachfolger (); } /* * Wenn wir die Person gefunden haben ... */ if (gefunden) { /* * ... mache sie unsichtbar und rücke die Schlange auf. */ ausgabe.macheUnsichtbar (); while (aktuellerKnoten != null) { aktuellerKnoten.verschiebeNachLinks (); aktuellerKnoten = aktuellerKnoten.gibNachfolger (); } } return ausgabe; } /** * Länge. * Nenne die Länge der Schlange. */ public int gibLaenge () { int anzahl = 0; Knoten aktuellerKnoten = ersterKnoten; while (aktuellerKnoten != null) { anzahl++; aktuellerKnoten = aktuellerKnoten.gibNachfolger (); } return anzahl; } }