Frage:
Hallo zusammen,
anhand des unten gezeigten Codes soll folgende Frage beantwortet werden:
- Liste gegeben: A -> [8,99,false] -> [4,99,false] -> [8,10,false] -> [10,8,false] -> [4,10,false] -> [4,3,false] -> [3,4,false] -> nil
- Welche Rückgabe liefert der Aufruf print(wasPassiert(A,3,99))?
Ich verstehe die erste Prozedur push und die zweite Funktion get so, dass zunächst eine neue Liste anhand der gegebenen Werte erstellt und aufgerufen wird.
Die dritte Funktion wasPassiert soll zunächst nach meinem Verständnis immer aus dem zweiten Zahlenwert und dem Wert true eine neue Liste B erstellen. Mir ist jedoch schleierhaft, wozu die Abfrage
if (B <> nil) then
B := B^.next;
if (B = nil) then
akt := 0
else
akt := B^.zu
dienen soll. Wenn B=nil, dann ist das Ende der Liste erreicht. Weiter verstehe ich es nicht. Ist diese Abfrage überhaupt nötig?
Bei der letzten Prozedur print verzweifle ich vollkommen. Hier stehe ich völlig auf dem Schlauch.
Bitte um Hilfe!
Vielen Dank schonmal.
Code:
type
tRefKante = ^tKante;
tKante = record
von: integer;
zu: integer;
x:boolean;
next: tRefKante
end;
procedure push(inVon:integer; inZu:integer; var ioG:tRefKante);
var
n:tRefKante;
begin
new(n);
n^.von := inVon;
n^.zu := inZu;
n^.x := false;
n^.next := ioG;
ioG := n
end;
function get(inG:tRefKante; inVon:integer):tRefKante;
var
n:tRefKante;
begin
get := nil;
n := inG;
while (n <> nil) do
begin
if ((n^.von = inVon) and (not n^.x)) then
get := n;
n := n^.next;
end;
end;
function wasPassiert(inG:tRefKante; inVon:integer; inZu:integer):tRefKante;
var
akt:integer;
kante:tRefKante;
B:tRefKante;
begin
akt := inVon;
B := nil;
while ((akt <> inZu) and (akt <> 0)) do
begin
kante := get(inG,akt);
if (kante <> nil) then
begin
push(B,kante^.von,kante^.zu);
akt := kante^.zu;
kante^.x := true
end
else
begin
if (B <> nil) then
B := B^.next;
if (B = nil) then
akt := 0
else
akt := B^.zu
end;
end;
wasPassiert := B
end;
procedure print(inGraph:tRefKante);
var
e,f : tRefKante;
begin
e := inGraph;
while (e^.next <> nil) do
begin
e := e^.next;
end;
write('[',e^.von, ',', e^.zu,']');
while (e <> inGraph) do
begin
f := inGraph;
while (f^.next <> e) do
begin
f := f^.next
end;
write('[',f^.von, ',', f^.zu,']');
e := f
end;
end;