home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1988
/
10_11
/
paslist.asc
< prev
next >
Wrap
Text File
|
1979-12-31
|
6KB
|
133 lines
PROGRAM BaumArray(Input, Output); { Kopfzeile }
{---------------------------------------------------------------
Speichern eines Binärbaums auf zwei Arten:
a) in einer dynamischen Datenstuktur
b) schichtenweise sequentiell in einem ARRAY
---------------------------------------------------------------}
CONST N = 63; { ermöglicht Baum bis zur }
{ Höhe 6, denn LOG2 (N+1) = 6 }
TYPE Zeiger = ^Knoten; { globale Typ- }
Knoten = RECORD { vereinbarungen }
Inhalt: Integer; { =Grundlage für }
Links, { den Aufbau des }
Rechts: Zeiger { binären Baums }
END;
VAR Speicher : ARRAY [1..N] OF Integer; { globale }
Wurzel : Zeiger; { Variablen- }
Eingabe : Integer; { vereinbarungen }
{--------------------------------------------------------------}
PROCEDURE ErzeugeBaum(VAR Anfang:Zeiger; Wert:Integer);
BEGIN
IF Anfang=NIL THEN
BEGIN { füge Wert als erstes Element in leeren Baum ein }
New(Anfang); { reserviere neuen Knoten }
WITH Anfang^ DO
BEGIN
Inhalt:=Wert;
Links :=NIL; { linker Unterbaum leer }
Rechts:=NIL { rechter Unterbaum leer }
END { WITH }
END { Anfang=NIL }
ELSE { füge Wert in den richtigen Unterbaum ein, }
WITH Anfang^ DO { Duplikate werden dabei ignoriert }
IF Wert<Inhalt THEN
ErzeugeBaum(Links,Wert) { Rekursion }è ELSE IF Wert>Inhalt THEN
ErzeugeBaum(Rechts,Wert) { Rekursion }
END; { Ende der Prozedurdefinition ErzeugeBaum }
{--------------------------------------------------------------}
PROCEDURE DurchlaufeBaum(Anfang:Zeiger); { inorder }
BEGIN { Anzeige aller Knoteninhalte gemäß }
IF Anfang<>NIL THEN { der vereinbarten Ordnung }
WITH Anfang^ DO
BEGIN
DurchlaufeBaum(Links); { Rekursion }
WRITE(Inhalt:5);
DurchlaufeBaum(Rechts) { Rekursion }
END { WITH }
END; { Ende der Prozedurdefinition DurchlaufeBaum }
{--------------------------------------------------------------}
PROCEDURE InitArray; { besetze Array mit Ausnahmewert 0 }
VAR i : 1..N;
BEGIN
FOR i:=1 TO N DO Speicher[i]:=0 { Willkür ! }
END; { Ende der Prozedurdefinition InitArray }
{--------------------------------------------------------------}
PROCEDURE FuelleArray(Baum:Zeiger; Nr:Integer);
{ Übertragen der Baumstruktur in das Array }
BEGIN
IF Baum<>NIL THEN
WITH Baum^ DO
BEGIN
IF Nr<=N THEN Speicher[Nr]:=Inhalt;
FuelleArray(Links,Nr*2); { Rekursion }
FuelleArray(Rechts,Nr*2+1) { Rekursion }
END { WITH }
END; { Ende der Prozedurdefinition FuelleArray }
{--------------------------------------------------------------}
PROCEDURE DurchlaufeArray(Start:Integer); { inorder }
BEGIN { Anzeige aller Arrayinhalte gemäß }
IF Speicher[Start]<>0 THEN { der vereinbarten Ordnung }
BEGIN
IF (Start*2)<=N THEN
DurchlaufeArray(Start*2); { Rekursion }
WRITE(Speicher[Start]:5);
IF (Start*2+1)<=N THEN
DurchlaufeArray(Start*2+1) { Rekursion }
END
END; { Ende der Prozedurdefinition DurchlaufeArray }
{--------------------------------------------------------------}
PROCEDURE GibArrayAus; { sequentiell }
VAR Anzahl,Feldweite,i : Integer;
BEGIN { Anzeige aller Inhalte in der Ordnung des Arrays }
Anzahl:=1;
REPEAT
Feldweite:=(N+1) DIV Anzahl;
FOR i:=Anzahl TO 2*Anzahl-1 DO { gib Schicht des Baums aus }
IF Speicher[i]<>0 THEN { 0 = Ausnahmewert }
Write(Speicher[i]:Feldweite)
ELSE Write('.':Feldweite); { nicht benutzte Knoten des }
WriteLn; { Baums werden durch . markiert }
Anzahl:=Anzahl*2
UNTIL Anzahl>N
END; { Ende der Prozedurdefinition GibArrayAus }
{--------------------------------------------------------------}è
BEGIN { Anweisungsteil des Hauptprogramms }
NEW(Wurzel); { Wurzel zeigt zunächst noch auf }
Wurzel:=NIL; { keinen Knoten; NIL = 'not in list'}
WriteLn('Elemente eingeben (0=Ende):');
Read(Eingabe); Write(', ');
WHILE Eingabe<>0 DO { Speichern von Daten }
BEGIN { geordnet in einem }
ErzeugeBaum(Wurzel,Eingabe); { Binärbaum }
Read(Eingabe);
IF Eingabe<>0 THEN Write(', ')
END; { WHILE }
WriteLn; Writeln;
WriteLn('Ausgabe der Baumelemente (inorder)');
WriteLn('----------------------------------');
DurchlaufeBaum(Wurzel);
WriteLn;
{ Speichern derselben Daten }
InitArray; { schichtenweise sequentiell }
FuelleArray(Wurzel,1); { in einem Array }
WriteLn;
WriteLn('Ausgabe der Arrayelemente (inorder)');
WriteLn('-----------------------------------');
DurchlaufeArray(1);
WriteLn; Writeln;
WriteLn('Zeilenweise sequentielle Ausgabe des Arrays');
WriteLn('-------------------------------------------');
GibArrayAus
END.