パスカル言語
通信大学の必修科目でパスカル言語を勉強し始めたのですが、
Tausch := ioZeigerEins;
ioZeigerEins := ioZeigerZwei;
ioZeigerZwei := Tausch;
のように、ioZeigerEins と ioZeigerZwei を交換するやり方は理解できたのですが、
procedure SortiereListe の中の、
Tausch := Element^.next;
Element^.next := Anfang;
Ende^.next := Tausch;
ZeigerTausch (Anfang, Element);
で、どうしてElement^.next が出てくるのかが良く理解出来ません。
長々と書いてしまいましたが、どうぞ宜しくお願い致します。
------------------------------------------------------
program TesteSortiereListe (input, output);
type
tNatZahl = 0..maxint;
tRefListe = ^tListe;
tListe = record
info : tNatZahl;
next : tRefListe;
end;
var
RefListe : tRefListe;
procedure SortiereListe (var ioRefListe : tRefListe);
{ sortiert eine lineare Liste aufsteigend }
var
Anfang,
Ende,
Tausch,
Suche,
Element : tRefListe;
function ZeigerTausch (var ioZeigerEins, ioZeigerZwei : tRefliste) : tRefListe;
begin
Tausch := ioZeigerEins;
ioZeigerEins := ioZeigerZwei;
ioZeigerZwei := Tausch;
end; { ZeigerTausch }
begin
if (ioRefListe <> nil) and (ioRefListe^.next <> nil) then
begin
Anfang := ioRefListe;
Ende := ioRefListe^.next;
if Ende^.info < Anfang^.info then
begin
Anfang^.next := Ende^.next;
Ende^.next := Anfang;
ZeigerTausch (Ende, Anfang);
end; { if-Schleife }
while Ende^.next <> nil do
begin
Element := Ende^.next;
if Element^.info > Ende^.info then
Ende := Ende^.next
else
if Element^.info < Anfang^.info then
begin
Tausch := Element^.next;
Element^.next := Anfang;
Ende^.next := Tausch;
ZeigerTausch (Anfang, Element);
end { then-Zweig }
else
begin
Suche := Anfang;
while Suche^.next^.info < Element^.info do
Suche := Suche^.next;
Tausch := Element^.next;
Element^.next := Suche^.next;
Suche^.next := Element;
Ende^.next := Tausch;
end; { else-Zweig }
end; { while-Schleife }
end; { if-Schleife }
ioRefListe := Anfang;
end; {SortiereListe }
procedure Anhaengen (var ioListe : tRefListe; inZahl : tNatZahl);
{ Haengt inZahl an ioListe an }
var Zeiger : tRefListe;
begin
Zeiger := ioListe;
if Zeiger = nil then
begin
new(ioListe);
ioListe^.info := inZahl;
ioListe^.next := nil;
end
else
begin
while Zeiger^.next <> nil do
Zeiger := Zeiger^.next;
new(Zeiger^.next);
Zeiger := Zeiger^.next;
Zeiger^.info := inZahl;
Zeiger^.next := nil;
end;
end;
procedure ListeEinlesen(var outListe : tRefListe);
{ liest eine durch Leerzeile abgeschlossene Folge von Integer-
Zahlen ein und speichert diese in der linearen Liste RefListe. }
var
Liste : tRefListe;
Zeile : string;
Zahl, Code : integer;
begin
writeln('Bitte geben Sie die zu sortierenden Zahlen ein.');
writeln('Beenden Sie Ihre Eingabe mit einer Leerzeile.');
Liste := nil;
readln(Zeile);
val(Zeile, Zahl, Code); { var konvertiert String nach Integer }
while Code=0 do
begin
Anhaengen (Liste, Zahl);
readln (Zeile);
val (Zeile, Zahl, Code);
end; { while}
outListe := Liste;
end; {ListeEinlesen}
procedure GibListeAus(inListe : tRefListe);
{ Gibt die Elemente von inListe aus }
var Zeiger : tRefListe;
begin
Zeiger := inListe;
while Zeiger <> nil do
begin
writeln(Zeiger^.info);
Zeiger := Zeiger^.next;
end; { while }
end; { GibListeAus }
begin
ListeEinlesen(RefListe);
SortiereListe(RefListe);
GibListeAus(RefListe);
end.
お礼
私にもなにかなせる事があると思いいろいろな理由でDelphiを勉強しています。 結局はクラスを使わず、関数で対処しました。 回答は、何冊か読んだ本では、直接書いていない事だったので、とても参考になりましたわ。感謝いたします。