PROGRAM KUNDENLISTE (INPUT, OUTPUT); (* BEISPIEL FUER DIE VERWALTUNG EINER LISTE MIT ZEIGERN. *) (* DIE DATEN WERDEN STAENDIG SORTIERT IN EINER LISTE GE- *) (* HALTEN. JEDER RECORD BESITZT DAZU EINEN ZEIGER AUF *) (* DEN ALPHABETISCHEN NACHFOLGER. UM DAS EINFUEGEN UND *) (* LOESCHEN EINFACH ZU GESTALTEN, BESITZT DIE LISTE JE *) (* EIN LEERES ELEMENT AM ANFANG UND ENDE. *) CONST LEN = 10; (* LAENGE EINES NAMENS *) TYPE STRING = STRING[LEN]; KUNDENZEIGER = ^ KUNDE; KUNDE = RECORD NAME : STRING; KNUMMER : INTEGER; NAECHSTER: KUNDENZEIGER; END; VAR KOPF: KUNDENZEIGER; (* KOPF DER KUNDENLISTE *) ENDE: KUNDENZEIGER; (* ENDE DER KUNDENLISTE *) CH : CHAR; (* BENUTZEREINGABE *) FUNCTION VORHANDEN(S:STRING; VAR Z:KUNDENZEIGER):BOOLEAN; (* SUCHT NAME (S) IN DER LISTE. ERGEBNIS=TRUE, FALLS *) (* S GEFUNDEN WURDE. Z ZEIGT BEI RUECKKEHR IMMER AUF *) (* DIE POSITION DES ALPHABETISCHEN VORGAENGERS. *) VAR Z1: KUNDENZEIGER; (* Z1 STEHT IMMER EIN RECORD*) (* WEITER ALS DER ZEIGER Z *) BEGIN Z:= KOPF; Z1:= KOPF^.NAECHSTER; ENDE^.NAME:= S; (* MARKE AM LISTENENDE *) WHILE Z1^.NAMEENDE) END; (* VORHANDEN *) PROCEDURE DRUCKE(Z: KUNDENZEIGER); (* DRUCKE DEN INHALT DES REFERENZIERTEN RECORDS *) BEGIN WITH Z^ DO WRITELN("NAME:",NAME:LEN+2," NUMMER:",KNUMMER:5) END; (* DRUCKE *) PROCEDURE EINGABE; (* EINGABE EINES NEUEN KUNDENRECORDS *) VAR N : STRING; NEU: KUNDENZEIGER; (* ZEIGER AUF NEUEN RECORD *) VOR: KUNDENZEIGER; (* ZEIGER AUF ALPABETISCHEN *) (* VORGAENGER IN DER LISTE *) BEGIN WRITE("NAME:"); READLN(N); IF VORHANDEN(N,VOR) THEN WRITELN(N," IST BEREITS KUNDE!") ELSE BEGIN NEW(NEU); (* NEUEN RECORD BESORGEN *) WRITE("KUNDENNUMMER:"); READLN(NEU^.KNUMMER); (* UND BELEGEN *) NEU^.NAME:= N; NEU^.NAECHSTER:= VOR^.NAECHSTER; VOR^.NAECHSTER:= NEU; (* NEU NACH VOR EINFUEGEN *) END END; (* EINGABE *) PROCEDURE AUSGABE; (* AUSGABE EINES KUNDENRECORDS *) VAR N : STRING; VOR: KUNDENZEIGER; (* ZEIGER AUF ALPABETISCHEN *) (* VORGAENGER IN DER LISTE *) BEGIN WRITE("NAME:"); READLN(N); IF VORHANDEN(N,VOR) THEN DRUCKE(VOR^.NAECHSTER) ELSE WRITELN(N,"NICHT ALS KUNDE GESPEICHERT!") END; (* AUSGABE *) PROCEDURE LOESCHEN; VAR N : STRING; VOR: KUNDENZEIGER; (* VORGAENGER IN DER LISTE *) BEGIN WRITE("NAME:"); READLN(N); IF VORHANDEN(N,VOR) THEN BEGIN WRITELN("GELOESCHT WURDE:"); DRUCKE(VOR^.NAECHSTER); (* NACHFOLGER VON VOR AUS *) (* DER LISTE STREICHEN: *) VOR^.NAECHSTER:= VOR^.NAECHSTER^.NAECHSTER; END ELSE WRITELN(N,"NICHT ALS KUNDE GESPEICHERT!") END; (* LOESCHEN *) PROCEDURE TABELLE; (* DRUCKE EINE ALPHABETISCHE LISTE ALLER KUNDEN *) VAR Z:KUNDENZEIGER; BEGIN Z:= KOPF^.NAECHSTER; (* Z AUF ANFANG DER LISTE *) WHILE Z<>ENDE DO (* SOLANGE NICHT LETZTEN *) BEGIN (* (LEEREN) RECORD ERREICHT:*) DRUCKE(Z); Z:=Z^.NAECHSTER (* ZUM NAECHSTEN KUNDEN *) END; END; (* TABELLE *) BEGIN (* HAUPTPROGRAMM *) NEW(KOPF); NEW(ENDE); (* ANFANG UND ENDE BILDEN *) KOPF^.NAECHSTER:=ENDE; (* LISTE IST LEER *) REPEAT (* EINGABESCHLEIFE *) WRITELN("E INGABE"); WRITELN("A USGABE"); WRITELN("L OESCHEN"); WRITELN("T ABELLE"); WRITELN("X BEENDEN"); READLN(CH); CASE CH OF "T": TABELLE; "E": EINGABE; "A": AUSGABE; "L": LOESCHEN; "X": ; ELSE WRITELN("UNGUELTIGE WAHL") END; UNTIL CH="X"; END.