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.