PROGRAM INF91(INPUT,OUTPUT); TYPE LREF=^LEADER; TREF=^TRAILER; LEADER=RECORD KEY:INTEGER; COUNT:INTEGER; TRAIL:TREF; NEXT:LREF; END; TRAILER=RECORD ID:LREF; NEXT:TREF; END; VAR HEAD,TAIL,P,Q:LREF; T:TREF;Z:INTEGER; X,Y:INTEGER; FUNCTION L(W:INTEGER):LREF; (*REFERENZ ZU LEADER MIT SCHLUESSEL W*) VAR H:LREF; BEGIN H:=HEAD;TAIL^.KEY:=W;(*MARKE*) WHILE H^.KEY<>W DO H:=H^.NEXT; IF H=TAIL THEN BEGIN (*ELEMENT IST NEU*) NEW(TAIL);Z:=Z+1; H^.COUNT:=0;H^.TRAIL:=NIL;H^.NEXT:=TAIL END; L:=H END;(*L*) BEGIN (*BEGINNE LISTE MIT LEEREM ELEMENT*) NEW(HEAD);TAIL:=HEAD;Z:=0; (*EINGABE VOM FILE*) READ(X); WHILE X<>0 DO (*0 ALS ENDE-MARKIERUNG AUF FILE*) BEGIN READLN(Y);WRITELN(X:5," <",Y:5); P:=L(X);Q:=L(Y); NEW(T);T^.ID:=Q;T^.NEXT:=P^.TRAIL; P^.TRAIL:=T;Q^.COUNT:=Q^.COUNT+1; READ(X) END; (*BILDE LISTE ALLER ELEMENTE OHNE VORGAENGER*) P:=HEAD;HEAD:=NIL; WHILE P<>TAIL DO BEGIN Q:=P;P:=P^.NEXT; IF Q^.COUNT=0 THEN BEGIN Q^.NEXT:=HEAD;HEAD:=Q END; END; (*SCHRITTWEISE AUS DER SCHLANGE AUSGEBEN*) Q:=HEAD; WHILE Q<>NIL DO BEGIN WRITE(Q^.KEY:5);Z:=Z-1; T:=Q^.TRAIL;Q:=Q^.NEXT; WHILE T<>NIL DO BEGIN P:=T^.ID;P^.COUNT:=P^.COUNT-1; IF P^.COUNT=0 THEN BEGIN (*AN SCHLANGE HAENGEN*) P^.NEXT:=Q;Q:=P END; T:=T^.NEXT END END; WRITELN; IF Z<>0 THEN WRITELN("DIESE MENGE IST NICHT PARTIELL GEORDNET"); END.