Problem z drzewem BST

0

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.
1

po dispose(r); powinieneś dopisać: r := nil;

0

Dzięki za szybką odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1