program liste (input,output); type tRefElement = ^tElement; tElement = record zahl : integer; next : tRefElement; end; var listenanfang : tRefElement; zeiger : tRefElement; endeListe : tRefElement; eingabe : integer; procedure alleDrucken(zuDrucken: tRefElement); var zeiger: tRefElement; begin writeln('Liste'); zeiger := zuDrucken; while zeiger <> nil do begin writeln(zeiger^.zahl); zeiger:= zeiger^.next; end; end; procedure RotiereListe(var ioRefAnfang: tRefElement); { Liste rotieren durch Ändern der Verkettung} var zeiger: tRefElement; begin if (ioRefAnfang<>nil) then if (ioRefAnfang^.next <> nil) then begin {letztes Element finden und next auf erstes umbiegen} zeiger:= ioRefAnfang; while (zeiger^.next<>nil) do zeiger:=zeiger^.next; zeiger^.next:= ioRefAnfang;
{Anfangszeiger umsetzen} ioRefAnfang := ioRefAnfang^.next;
{Zeiger next des letzten Elements auf nil} {zeiger^.next^.next := nil;} zeiger:= zeiger^.next; zeiger^.next := nil; end; {if (ioRefAnfang<>nil)} end; {prozedure RotiereListe} procedure umdrehen(var ioRefAnfang: tRefElement); var vorher,zeiger,nachher: tRefElement; begin if (ioRefAnfang<>nil) then if (ioRefAnfang^.next <> nil) then begin zeiger:= ioRefAnfang; vorher:= nil; nachher:= zeiger^.next; while (zeiger<>nil) do begin zeiger^.next:= vorher; vorher:=zeiger; zeiger:=nachher; if (zeiger<>nil) then nachher:= zeiger^.next; end; ioRefAnfang := vorher; end; end; function umdrehen_rekursiv( inRefAnfang: tRefElement): tRefElement; var liste: tRefElement; begin if inRefAnfang=nil then umdrehen_rekursiv:=nil else if inRefAnfang^.next=nil then umdrehen_rekursiv:= inRefAnfang else begin liste:= umdrehen_rekursiv(inRefAnfang^.next); inRefAnfang^.next^.next := inRefAnfang; inRefAnfang^.next:= nil; umdrehen_rekursiv := liste; end; end; BEGIN listenanfang := nil; writeln('Eingabe der Zahlen, Beenden mit 0'); readln(eingabe); while eingabe <> 0 do begin new(zeiger); zeiger^.zahl := eingabe; zeiger^.next:=nil; if listenanfang = nil then listenanfang := zeiger else endeListe^.next:=zeiger; endeListe := zeiger; readln(eingabe); end; alleDrucken(listenanfang); {RotiereListe(listenanfang);} {umdrehen(listenanfang);} alleDrucken(umdrehen_rekursiv(listenanfang)); END.
program Felder (input,output); const FELDMAX = 3; type tIndex = 1..FELDMAX; tFeld = array[tIndex,tIndex] of integer; var a,b,c : tFeld; eingabe : integer; zeiger : integer; zeile,spalte: integer; procedure alleDrucken(zuDrucken: tFeld); var zeile,spalte: integer; begin for zeile := 1 to FELDMAX do begin for spalte := 1 to FELDMAX do write(zuDrucken[zeile, spalte],' '); writeln; end; writeln; end; function addMatrix(inA,inB: tFeld): tFeld; var zeile,spalte: integer; erg: tFeld; begin for zeile := 1 to FELDMAX do begin for spalte := 1 to FELDMAX do erg[zeile, spalte] := inA[zeile, spalte] + inB[zeile, spalte] ; end; addMatrix := erg; end; function multMatrix(inA,inB: tFeld): tFeld; var zeile,spalte,i: integer; erg: tFeld; begin for zeile := 1 to FELDMAX do for spalte := 1 to FELDMAX do begin erg[zeile, spalte]:=0; for i:=1 to FELDMAX do erg[zeile, spalte]:= erg[zeile, spalte] + inA[zeile,i]*inB[i,spalte]; end; multMatrix := erg; end;
BEGIN writeln('Eingabe der Zahlen'); for zeile := 1 to FELDMAX do begin for spalte := 1 to FELDMAX do read(a[zeile,spalte]); writeln; end; writeln('Eingabe der Zahlen'); for zeile := 1 to FELDMAX do begin for spalte := 1 to FELDMAX do read(b[zeile,spalte]); writeln; end; alleDrucken(a); alleDrucken(b); c:=addMatrix(a,b); alleDrucken(c); c:=multMatrix(a,b); alleDrucken(c); END.
program suchbaum (input, output); { Binärer Suchbaum }
type tRefBinbaum = ^tBinbaum; tBinBaum = record Info:integer; links, rechts : tRefBinBaum; end; tNatZahl = 0..maxint;
var Wurzel : tRefBinBaum; Max : tNatZahl; zahl1,zahl2,ergebnis,tiefe:integer; gefunden:boolean; oben,unten:integer; procedure BBKnotenEinfuegen ( inZahl : integer; var ioWurzel : tRefBinBaum); { fuegt in den Suchbaum, auf dessen Wurzel ioWurzel zeigt, ein Blatt mit Wert inZahl an. }
var Zeiger : tRefBinBaum;
begin if ioWurzel = nil then
begin new (Zeiger); Zeiger^.Info := inZahl; Zeiger^.links := nil; Zeiger^.rechts := nil; ioWurzel := Zeiger end { if } else { ioWurzel <> nil } if inZahl < ioWurzel^.info then BBKnotenEinfuegen (inZahl, ioWurzel^.links) else BBKnotenEinfuegen (inZahl, ioWurzel^.rechts); end; { BBKnotenEinfuegen }
procedure BBAufbauen (var outWurzel : tRefBinBaum); { Liest eine Folge von Integer-Zahlen ein (0 beendet die Eingabe, gehoert aber nicht zur Folge) und speichert die Folge in einem binren Suchbaum. }
var Zahl : integer;
begin outWurzel := nil; { mit leerem Baum initialisieren } read (Zahl); while Zahl <> 0 do begin BBKnotenEinfuegen (Zahl, outWurzel); read (Zahl) end end; { BBAufbauen }
procedure inorder(inWurzel: tRefBinBaum); begin if (inWurzel <> nil) then begin inorder(inWurzel^.links); writeln(inWurzel^.Info); inorder(inWurzel^.rechts); end; end; procedure baumaufbau(inWurzel: tRefBinBaum; inTiefe:integer); var i:integer; begin if (inWurzel = nil) then begin for i:=0 to inTiefe do write(' '); writeln('nil'); end else begin baumaufbau(inWurzel^.rechts, inTiefe+1); for i:=0 to inTiefe do write(' '); writeln(inWurzel^.Info); baumaufbau(inWurzel^.links, inTiefe+1); end; end; procedure umdrehen(inWurzel: tRefBinBaum); var tausch: tRefBinBaum; begin if inWurzel<>nil then begin umdrehen(inWurzel^.links); umdrehen(inWurzel^.rechts); tausch:= inWurzel^.links; inWurzel^.links:= inWurzel^.rechts; inWurzel^.rechts:= tausch; end; end; procedure IntervallSuche(inWurzel: tRefBinBaum; inUnten, inOben: integer); begin if (inWurzel <> nil) then begin IntervallSuche(inWurzel^.links,inUnten,inOben); if ((inWurzel^.Info>= inUnten) and (inWurzel^.Info<=inOben)) then writeln(inWurzel^.Info); IntervallSuche(inWurzel^.rechts,inUnten,inOben); end; end; procedure IntervallSucheOptimiert(inWurzel: tRefBinBaum; inUnten, inOben: integer); begin if (inWurzel <> nil) then begin if (inUnten < inWurzel^.Info) then IntervallSucheOptimiert(inWurzel^.links,inUnten,inOben); if ((inWurzel^.Info>= inUnten) and (inWurzel^.Info<=inOben)) then writeln(inWurzel^.Info); writeln('besucht: ' , inWurzel^.Info); if (inOben > inWurzel^.Info) then IntervallSucheOptimiert(inWurzel^.rechts,inUnten,inOben); end; end; function Suche(inWurzel: tRefBinBaum; inZahl: integer): boolean; begin if (inWurzel= nil) then Suche:= false else if (inWurzel^.Info = inZahl) then Suche:=true else if (inWurzel^.Info > inZahl) then Suche := Suche(inWurzel^.links, inZahl) else Suche:= Suche(inWurzel^.rechts, inZahl); end; function SucheIterativ(inWurzel: tRefBinBaum; inZahl: integer): boolean; var zeiger: tRefBinBaum; gefunden: boolean; begin zeiger:= inWurzel; gefunden:=false; while ((zeiger <> nil) and (not gefunden)) do begin if (zeiger^.Info=inZahl) then gefunden:= true; if (inZahl < zeiger^.Info) then zeiger:= zeiger^.links else zeiger:= zeiger^.rechts; end; SucheIterativ:=gefunden; end; function KnotenVonIndex( inBaum : tRefBinBaum; inIndex : integer) : tRefBinBaum; { findet den Knoten zum Binärbaumindex } var BinaerString: String; i:integer; zeiger: tRefBinBaum; begin BinaerString:=''; i:= inIndex; while i>1 do begin if (i mod 2)=0 then BinaerString := '0' + BinaerString else BinaerString := '1' + BinaerString; i:= i div 2; end; i:=1; zeiger:= inBaum; for i:=1 to length(BinaerString) do begin if (BinaerString[i]='0') then zeiger:= zeiger^.links else zeiger:= zeiger^.rechts; end; KnotenVonIndex := zeiger; end; function KnotenVonIndex2( inBaum : tRefBinBaum; inIndex : integer; inAktuellIndex: integer ) : tRefBinBaum; { findet den Knoten zum Binärbaumindex } var zeiger: tRefBinBaum; begin if inBaum=nil then KnotenVonIndex2 := nil else begin if (inIndex=inAktuellIndex) then KnotenVonIndex2 := inBaum else begin zeiger:= KnotenVonIndex2(inBaum^.links, inIndex, inAktuellIndex*2); if zeiger =nil then zeiger:= KnotenVonIndex2(inBaum^.rechts, inIndex, inAktuellIndex*2+1); KnotenVonIndex2:= zeiger; end; end; end; function KnotenVonIndex3 ( baum : tRefBinBaum; index : integer) : tRefBinBaum; { findet den Knoten zum Binärbaumindex }
var elter : tRefBinBaum; { Zeiger auf Elternknoten }
begin if (index = 1) then { Wurzel, Rekursionsabbruch } KnotenVonIndex3 := baum else begin { Rekursion } elter := KnotenVonIndex3(baum, index div 2); if ( (index mod 2 ) = 0 ) then KnotenVonIndex3 := elter^.links else KnotenVonIndex3 := elter^.rechts end; end;
begin writeln('Bitte integer-Zahlen eingeben (0=Ende):'); BBAufbauen (Wurzel); writeln('Inorder-Reihenfolge'); inorder(Wurzel); {umdrehen(Wurzel);} {write('unten: '); readln(unten); write('oben: '); readln(oben); IntervallSucheOptimiert(Wurzel,unten,oben); writeln('Inorder-Reihenfolge'); inorder(Wurzel);} {writeln(SucheIterativ(Wurzel, 5));} {baumaufbau(Wurzel,0);} {writeln(KnotenVonIndex(Wurzel, 5)^.Info);} {writeln(KnotenVonIndex2(Wurzel, 5,1)^.Info);} writeln(KnotenVonIndex3(Wurzel, 5)^.Info);
end. { suchbaum }