Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2014, 15:20   #1
fergus2010
 
Регистрация: 08.12.2009
Сообщений: 3
По умолчанию обход прошитого дерева

Почему то при прошивке дерева вылезает переполнение стека

Код:
        unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
type u=^uz;
        uz= record
        i:integer; 
        l,r:u; 
        ltag  : boolean;
        rtag  : boolean;
        end;

var h,pold,y,x, p:u ; dn,s:integer;


function tree(k:integer):u;

var t:u;
begin

if k=0 then begin tree:=nil; exit; end;
new(t);
t^.i:=random(20)-5;
 t^.l:=tree(k div 2);
   t^.r:=tree(k-k div 2 - 1);
      tree:=t;
end;

procedure downup(h:u);

begin
 if h<>nil then begin
 downup(h^.l);
 downup(h^.r);
    Form1.Memo3.Lines.Add(inttostr(h^.i));
 end;
end;
   procedure updown(h:u);
 

begin
 if h<>nil then begin
 Form1.Memo1.Lines.Add(inttostr(h^.i));
updown(h^.l);
updown(h^.r);

end;
end;

procedure lr(h:u);

begin
 if h<>nil then begin
  lr(h^.l);
  Form1.Memo2.Lines.Add(inttostr(h^.i));
 
 lr(h^.r);

 end;
end;


procedure showtree(h:u; x,y,w,f:integer);
var
  s:string;
  r1: integer;
begin
  r1:=3;
  if h<> nil then
    with form1.Image1.Canvas do
      begin
        showtree(h^.l,x-w div 4,y+4*r1,w div 2,1); 
        showtree(h^.r,x+w div 4,y+4*r1,w div 2,-1); 
        if f<>0 then
          begin
            moveto(x,y);
            LineTo(x+f*(w div 2),y-4*r1);
          end;
        ellipse(x-5,y-5,x+15,y+15);
        s:=inttostr(h^.i);
        textout(x,y,s);
      end;
end;

 procedure sim_print(var x:u);
       procedure rpr( var p:u);
         begin
            if(y = NIL) then
        exit;
    rPr(y^.r);
    if(y^.r <> NIL) then
        y^.rtag := true
    else
    begin
        y^.rtag := false;
        y^.r := pold;
    end;
    pold := p;
    if(y^.ltag = true) then
        rPr(y^.l);
        end;
    begin
      if  x<> nil then
        begin
        sim_print(x^.l);
        rpr(x);
        sim_print(x^.r);
     end;
   end;



var

  i, n : integer;
    head :u;           
    o : u;      
Begin
    h:=tree(15);
  showtree(h,320,50,640,0);
 
   lr(h);
  downup(h);
  updown(h);
  new(head);
    head^.l := h;
    head^.r := head;
    pold := head;
    o := head^.l;
    sim_print(o);
   
  end;
End.

------------------
к сожалению, на форуме нет тега [spoiler]
поэтому используйте тег [code] для оформления кода.

Модератор
------------------
Вложения
Тип файла: rar pbd.rar (334.9 Кб, 6 просмотров)

Последний раз редактировалось Serge_Bliznykov; 23.01.2014 в 15:49.
fergus2010 вне форума Ответить с цитированием
Старый 23.01.2014, 15:59   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Чего вы с деревом делаете?
Человек_Борща вне форума Ответить с цитированием
Старый 23.01.2014, 19:40   #3
fergus2010
 
Регистрация: 08.12.2009
Сообщений: 3
По умолчанию

прошить дерево и обойти его после прошивки
fergus2010 вне форума Ответить с цитированием
Старый 23.01.2014, 21:04   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Похоже только вы и знаете это ваше "прошить дерево".
Человек_Борща вне форума Ответить с цитированием
Старый 23.01.2014, 21:23   #5
fergus2010
 
Регистрация: 08.12.2009
Сообщений: 3
По умолчанию

хорошо я обхожу правую ветку дерева,ишу пустые узлы и при попытке указать то что узел не пуст и его не нужно заменять вылезает переполнение стека а кокретно здесь вылетает ошибка
if(y^.r <> NIL) then
y^.rtag := true
что стек переолнен
fergus2010 вне форума Ответить с цитированием
Старый 23.01.2014, 22:44   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Увеличьте размер стэка.
Человек_Борща вне форума Ответить с цитированием
Старый 23.01.2014, 23:00   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вот здесь например. Ставте точку останова на rPr(y^.r)
Код:
 procedure sim_print(var x:u);
       procedure rpr( var p:u);
         begin
            if(y = NIL) then
        exit;
    rPr(y^.r);
А код не мешало бы нормально форматировать, вам же хуже
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.01.2014 в 23:05.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход дерева mohita C# (си шарп) 1 11.12.2011 19:48
Обход бинарного дерева cyt Паскаль, Turbo Pascal, PascalABC.NET 2 17.12.2010 03:29
Создание и обход дерева jonni2008 Общие вопросы .NET 1 12.11.2010 06:05
Симетрический обход дерева LokTar Помощь студентам 4 18.05.2010 11:49
обход дерева ribka Помощь студентам 2 11.12.2007 20:38