Hallo liebe
DP-Mitglieder,
Mein Anliegen ist folgendes:
Ich wollte mir eine
Unit Programmieren - "UBaum" - In der ein Objekt "TBaum" alle lästigen Aufgaben für mich übernehmen, die ein Binärer Baum mitsich bringt. Das Objekt an und für sich funktioniert, allerdings gibt es Probleme mit dem
Objekt TElement (TElement.Create) bzw. Bei der prozedure TBaum-Loeschen. Bei dieser prozedure und dem constructor von
TElement tritt jeweils eine Zugriffsverletzung auf... Ich habe keine Ahnung woran das liegen könnte. Vlt. könnt ihr mir da
weiterhelfen.
im Folgenden habe ich die
Unit "MainU" (aufrufende
Unit) und die
Unit "BaumU" (Problemunit) für euch bereit gestellt. Diese
Unit (BaumU) enthält bisher wenige prozeduren, die das Arbeiten mit Bäumen leichter machen. Ich hoffe, dass mir jemand
helfen kann,
mit freundlichen Grüßen,
Sebastian.
Delphi-Quellcode:
unit MainU;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, BaumU,
StdCtrls;
type
TForm1 =
class(TForm)
Edit1: TEdit;
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject;
var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
type
TInhalt =
record
Name :
String;
end;
var
Form1: TForm1;
Baum : TBaum;
Element :TElement;
implementation
{$R *.DFM}
function Auslesen :TInformation;
begin
Auslesen.Numer:=1;
Auslesen.Inhalt.
Name:=Form1.Edit1.Text;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Baum.Create;
end;
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Baum.Delete;
Baum.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Element.Create;
Baum.Element.Initialisieren(Auslesen);
Baum.Element.Hinzu;
end;
end.
Und hier die
Unit BaumU:
Delphi-Quellcode:
unit BaumU;
interface
type
TInhalt =
record
Name :
String;
end;
TInformation =
record
Numer :Integer;
Inhalt :TInhalt;
end;
TZeiger = ^TSatz;
TSatz =
record
Inhalt :TInformation;
zRechts,
zLinks :TZeiger;
end;
type
TElement =
Class(TObject)
Information :TInformation;
zElementWurzel :TZeiger;
private
Procedure ZuBaumHinzu(zNeu :TZeiger;
var zAktuell :TZeiger);
public
constructor Create;
Procedure Initialisieren(X :TInformation);
Procedure Hinzu;
end;
type
TBaum =
Class(TObject)
Element :TElement;
zWurzel :TZeiger;
private
Procedure Loeschen(zAktuell :TZeiger);
public
constructor Create;
Procedure Initialisieren;
Procedure Delete;
end;
var
ZUebergang :Tzeiger;
implementation
constructor TElement.Create;
begin
inherited Create;
zElementWurzel:=zUebergang;
end;
Procedure TElement.Initialisieren(X :TInformation);
begin
Information:=X;
end;
Procedure TElement.ZuBaumHinzu(zNeu :TZeiger;
var zAktuell :TZeiger);
begin
if (zAktuell<>
nil)
then if((Information.Numer)>(zAktuell^.Inhalt.Numer))
then ZuBaumHinzu(zNeu,zAktuell^.zLinks)
else ZuBaumHinzu(zNeu,zAktuell^.zRechts)
else zAktuell:=zNeu;
end;
Procedure TElement.Hinzu;
var zNeu :TZeiger;
begin
new(zNeu);
zNeu^.zRechts:=nil;
zNeu^.zLinks:=nil;
zNeu^.Inhalt:=Information;
ZuBaumHinzu(zNeu, zElementWurzel);
end;
constructor TBaum.Create;
begin
inherited Create;
Initialisieren;
ZUebergang:=zWurzel;
end;
Procedure TBaum.Initialisieren;
begin
zWurzel:=nil;
end;
procedure TBaum.Loeschen(zAktuell :TZeiger);
var zHilfR,zHilfL :TZeiger;
begin
if(zAktuell<>
nil)
then begin
zHilfL:=zAktuell^.zLinks;
zHilfR:=zAktuell^.zRechts;
Loeschen(zHilfL);
Dispose(zAktuell);
Loeschen(zHilfR);
end;
end;
Procedure TBaum.Delete;
begin
Loeschen(zWurzel);
Initialisieren;
end;
end.