MODULE Graph; IMPORT Out; TYPE EdgeValT* =LONGINT; (* Typ fuer Kantenbewertung *) NodeNrT*=INTEGER; (* Typ fuer Knotennummer *) MatrixT =POINTER TO ARRAY OF ARRAY OF EdgeValT; GraphT* =RECORD n-: NodeNrT; (* Knotenzahl *) a: MatrixT; (* Adjazenzmatrix *) w: MatrixT; (* Wegematrix *) m: POINTER TO ARRAY OF ARRAY OF NodeNrT; (* Orientierungsmatrix *) END; (*record*) CONST NOEDGE=MAX(EdgeValT); (* Kantenbewertung fuer: keine Kante = quasi Unendlich *) NONODE=MIN(NodeNrT); (* Auspraegung fuer: kein Knoten *) PROCEDURE (VAR g:GraphT) Init*(v:NodeNrT); VAR i,j: NodeNrT; BEGIN (*Init*) ASSERT(v>0); NEW(g.a, v,v); ASSERT(g.a#NIL); NEW(g.w, v,v); ASSERT(g.w#NIL); NEW(g.m, v,v); ASSERT(g.m#NIL); g.n:=v; FOR i:=0 TO g.n-1 DO FOR j:=0 TO g.n-1 DO g.a[i,j]:=NOEDGE END (*for*) END (*for*) END Init; PROCEDURE (VAR g:GraphT) CleanUp*(); BEGIN (*CleanUp*) IF g.a#NIL THEN DISPOSE(g.a); g.a:=NIL END; (*if*) IF g.w#NIL THEN DISPOSE(g.w); g.w:=NIL END; (*if*) IF g.m#NIL THEN DISPOSE(g.m); g.m:=NIL END; (*if*) g.n:=0; END CleanUp; PROCEDURE (VAR g:GraphT) SetEdge*(x,y:NodeNrT; value:EdgeValT); BEGIN (*SetEdge*) ... END SetEdge; PROCEDURE (VAR g:GraphT) Warshall*(); VAR i,j,k: NodeNrT; BEGIN (*Warshall*) ... END Warshall; PROCEDURE (VAR g:GraphT) PrintWay*(x,y: NodeNrT); VAR h:NodeNrT; (* Zwischenknoten *) BEGIN (*PrintWay*) ... END PrintWay; PROCEDURE (VAR g:GraphT) PrintOrientation*(); VAR i,j:NodeNrT; BEGIN (*PrintOrientation*) Out.String(" "); FOR j:=0 TO g.n-1 DO Out.Int(j,5) END; FOR i:=0 TO g.n-1 DO Out.Ln; Out.Int(i,3); Out.String(": "); FOR j:=0 TO g.n-1 DO Out.String(" "); IF (g.m[i,j]#NONODE) THEN Out.Int(g.m[i,j],3) ELSE Out.String(" .") END (* if *) END (* for *) END (* for *) END PrintOrientation; PROCEDURE Print(mat:MatrixT; nr:NodeNrT); VAR i,j:NodeNrT; BEGIN (*Print*) Out.String(" "); FOR j:=0 TO nr-1 DO Out.Int(j,5) END; FOR i:=0 TO nr-1 DO Out.Ln; Out.Int(i,3); Out.String(": "); FOR j:=0 TO nr-1 DO Out.String(" "); (* damit alle Matrizen gleich ausgegeben werden koennen*) IF (mat[i,j]#NOEDGE) THEN Out.Int(mat[i,j],3) ELSE Out.String(" .") END (* if *) END (* for *) END (* for *) END Print; PROCEDURE (VAR g:GraphT) PrintAdj*(); BEGIN (*PrintAdj*) Print(g.a, g.n) END PrintAdj; PROCEDURE (VAR g:GraphT) PrintWays*(); BEGIN (*PrintWays*) Print(g.w, g.n) END PrintWays; BEGIN (*Graph*) END Graph.