program zeiger;
uses crt;
type tRefPerson = ^tPerson; tPerson = record Name: string; Alter: integer; next: tRefPerson; end;
var ErstePerson, Person1 : tRefPerson; procedure drucken(inPerson: tRefPerson); begin writeln(inPerson^.Name); writeln(inPerson^.Alter); end; procedure alleDrucken(inAnfang: tRefPerson); var zeig: tRefPerson; begin zeig:= inAnfang; while (zeig <> nil) do begin drucken(zeig); zeig:= zeig^.next; end; end;
BEGIN new(ErstePerson); readln(ErstePerson^.Name); readln(ErstePerson^.Alter); ErstePerson^.next := nil; drucken(ErstePerson); new(Person1); readln(Person1^.Name); readln(Person1^.Alter); Person1^.next := nil; ErstePerson^.next := Person1; alleDrucken(ErstePerson); END.
program kehrwert (input,output);
uses crt; type tBruch = record zaehler, nenner : integer; end; var bruch : tBruch; procedure kw(var ioBruch: tBruch); var tausch: integer; begin tausch:= ioBruch.zaehler; ioBruch.zaehler:= ioBruch.nenner; ioBruch.nenner := tausch; end; procedure drucken( inBruch: tBruch); begin writeln(inBruch.zaehler,'/',inBruch.nenner); end;
BEGIN readln(bruch.zaehler); readln(bruch.nenner); drucken(bruch); kw(bruch); drucken(bruch); END.
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
EndeSortiert,
einSortieren,
unsortiert,
hilfszeiger,
hilfszeiger2: tRefListe;
begin
if (ioRefListe <> nil) then
begin
EndeSortiert:= ioRefListe;
unsortiert := ioRefListe^.next;
while (unsortiert <> nil) do
begin
einSortieren := unsortiert;
writeln(einSortieren^.info);
unsortiert:= unsortiert^.next;
EndeSortiert^.next := nil;
if (einSortieren^.info < ioRefListe^.info) then
begin
einSortieren^.next := ioRefListe;
ioRefListe:= einSortieren;
end
else
if (einSortieren^.info >= EndeSortiert^.info) then
begin
EndeSortiert^.next := einSortieren;
EndeSortiert:= einSortieren;
EndeSortiert^.next:= nil;
end
else
begin
hilfszeiger:= ioRefListe;
hilfszeiger2 := hilfszeiger^.next;
while (einSortieren^.info < hilfszeiger2^.info) do
begin
hilfszeiger:= hilfszeiger2;
hilfszeiger2:=hilfszeiger2^.next;
end;
hilfszeiger^.next := einSortieren;
einSortieren^.next:= hilfszeiger2;
end;
end;
end;
end;
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;
{ Jetzt zeigt Zeiger auf das letzte Element }
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); { val 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.
Die While-Bedingung ist falsch.
while (einSortieren^.info < hilfszeiger2^.info) do begin hilfszeiger:= hilfszeiger2; hilfszeiger2:=hilfszeiger2^.next; end;
Wenn z.B. in die Liste (1,5) die 3 einsortiert werden soll, zeigt hilfszeiger zu Anfang auf die 1 und hilfszeiger2 auf die 5.
Da die 3 kleiner ist als die 5, zeigt hilfszeiger im nächsten Schritt auf die 5 und
hilfszeiger2 ins Leere.
Es soll aber die 3 zwischen 1 und 5 eingefügt werden. Deshalb muss die Bedingung anders formuliert werden:
while (einSortieren^.info < hilfszeiger^.info) do begin hilfszeiger:= hilfszeiger2; hilfszeiger2:=hilfszeiger2^.next; end;
Jetzt wird die Schleife sofort beendet, weil die 3 größer als die 1 ist.
Die Schleife muss beendet werden, sobald das einzusortierende Element größer wird als das, auf welches hilfszeiger zeigt.
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 15642}
var
sortiertEnde,
unsortiertStart,
unsortiert,
zeiger2,
zeiger3: tRefListe;
begin
if ioRefListe<>nil then
begin
if ioRefListe^.next<>nil then
begin
sortiertEnde:=ioRefListe;
unsortiertStart:= ioRefListe^.next;
sortiertEnde^.next:=nil;
while unsortiertStart<>nil do
begin
unsortiert:=unsortiertStart;
writeln(unsortiert^.info);
unsortiertStart:= unsortiertStart^.next;
if unsortiert^.info<ioRefListe^.info then
{ganz vorne einsortieren}
begin
writeln('vorne');
unsortiert^.next:=ioRefListe; iorefliste:= unsortiert;
end
else
if unsortiert^.info>=sortiertEnde^.info then
{hinten einsortieren}
begin
writeln('hinten');
sortiertEnde^.next:= unsortiert; sortiertEnde:=unsortiert;
sortiertEnde^.next:=nil;
end
else
{einsortieren}
begin
writeln('mitte');
zeiger2:=ioRefListe; zeiger3:=ioRefListe^.next;
while (unsortiert^.info>zeiger3^.info) do
begin
zeiger2:=zeiger3; zeiger3:=zeiger3^.next;
end;
unsortiert^.next:=zeiger3; zeiger2^.next:=unsortiert;
end;
end;
end; {Durchlaufe Liste}
writeln;
end;
end; {Sortiere Liste}
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;
{ Jetzt zeigt Zeiger auf das letzte Element }
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); { val 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.