W naj sam przód jako iż jest to mój pierwszy post na tymże zacnym forum pragnę bardzo serdecznie powitać wszystkich zgromadzonych. Witam!
Mój problem jest następujący.
Za zadanie mam napisać program, w którym z ListBoxa pobieram wartości(5 ustalonych w kodzie następne 5 mogę dodać) i tworzę z nich drzewo BST w postaci struktury dynamicznej. Następnie mam narysować to drzewo na formatce. Do tego momentu jakoś sobie poradziłem. Problem polega na tym że ma być jeszcze przycisk do zwalniania pamięci zajmowanej przez to drzewo.
I ta opcja własnie u mnie działa/ nie działa, kiedy próbuje narysować drzewo jeszcze raz (po usunięciu) pojawia się error: project1 raised exception class 'External: SIGSEGV'.
Poniżej wklejam kod. Może ktoś podpowie co źle robię.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, ComCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
dodaj: TButton;
mem: TButton;
Rysuj: TButton;
Usun: TButton;
Edit1: TEdit;
ListBox1: TListBox;
StatusBar1: TStatusBar;
StatusPam: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure memClick(Sender: TObject);
procedure dodajClick(Sender: TObject);
procedure RysujClick(Sender: TObject);
procedure UsunClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
wskaznik = ^element;
element = record
dana:integer;
left:wskaznik;
right:wskaznik;
end;
var
Form1: TForm1;
a,b,x,y:integer;
c:char;
drzewko:wskaznik;
implementation
{$R *.lfm}
procedure show_tree(var r:wskaznik;x,y,i:integer);
var
xt,yt:integer;
begin
if r<>nil then
begin
xt:=x;
yt:=y;
Form1.Canvas.TextOut(x,y,IntToStr(r^.dana));
show_tree(r^.left, x-i, y+50,i div 2);
Form1.Canvas.LineTo(xt,yt);
show_tree(r^.right, x+i, y+50,i div 2);
Form1.Canvas.LineTo(xt,yt);
end;
end;
procedure add_node(var n:wskaznik; a:integer);
begin
if n=nil then
begin
new(n);
n^.dana:=a;
n^.left:=nil;
n^.right:=nil;
end
else
if a < n^.dana then add_node(n^.left,a) else add_node(n^.right,a);
end;
procedure remove_tree(var r:wskaznik);
begin
if r<> nil then
begin
remove_tree(r^.left);
remove_tree(r^.right);
dispose(r);
end;
end;
{ TForm1 }
procedure TForm1.dodajClick(Sender: TObject);
begin
if ListBox1.Items.Count>=10 then ShowMessage('Dodano już 10 wpisów!');
if (ListBox1.Items.Count<10)and (Edit1.Text<>'') then ListBox1.Items.Add(Edit1.Text);
end;
procedure TForm1.RysujClick(Sender: TObject);
var
i:integer;
begin
for i:=0 to (ListBox1.Count)-1 do
add_node(drzewko,StrToInt(ListBox1.Items.Strings[i]));
show_tree(drzewko,350,70,40);
Rysuj.Enabled:=false;
end;
procedure TForm1.UsunClick(Sender: TObject);
begin
remove_tree(drzewko);
Rysuj.Enabled:=true;
Form1.Canvas.Brush.Color:=clDefault;
Form1.Canvas.FillRect(200,1,Width,Height);
end;
procedure TForm1.memClick(Sender: TObject);
var meminfo: THeapStatus;
begin
meminfo:=GetHeapStatus;
StatusPam.Items.Add('TotalAllocated ' + inttostr(meminfo.TotalAllocated));
StatusPam.Items.Add('TotalFree ' + inttostr(meminfo.TotalFree));
StatusPam.Items.Add(' ');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Items.Add('4');
ListBox1.Items.Add('2');
ListBox1.Items.Add('1');
ListBox1.Items.Add('3');
ListBox1.Items.Add('5');
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
StatusBar1.Panels.Items[1].Text:=IntToStr(x);
StatusBar1.Panels.Items[3].Text:=IntToStr(y);
end;
end.