Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Работа с деревьями 
V
    Опции темы
iriss
Дата 17.12.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.12.2006

Репутация: нет
Всего: нет



[delphi] Работа с деревьями
программа должна создавать дерево, выводить дерево на экран, считать количество элемента в дереве,сумму элементов дерева, максимальную глубину и сохранять дерево в файл. у меня не работают процедуры подсчета максимальной глубины дерева и суммы элементов дерева. никак не могу найти ошибку, помогите, пожалуйста smile 
Код

program Project72;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type

ref=^node;
node=record
key:integer;
left,right:ref;
end;
mm=array of integer;
var
//head:ref;
nn:ref;
n,y,s,j,l:integer;
f:text;
r:mm;
//s:mm;
//q,h:integer;

function Creat_tree(n:integer):ref;
 var
 newnode:ref;
 x,nl,nr:integer;
 begin
 if n=0 then Creat_tree:=nil
 else
 begin
 nl:=n div 2;
 nr:=n-nl-1;
 x:=random(99)+1;
 new(Newnode);
 with newnode^ do
 begin
 key:=x;
 left:=Creat_tree(nl);
 right:= Creat_tree(nr);
 end;
 creat_tree:=newnode;
 end;
 end;

function Creat(n:integer):ref;
  var
  newnode:ref;
    x:integer;
    nl,nr:integer;
    begin
    if n=0 then Creat:=nil
    else
    begin
    nl:= n div 2;
    nr:= n - nl -1;
  new(Newnode);
    with newnode^ do
    begin
    writeln('vvedite chislo');
  readln(key);
       left:=creat(nl);
       right:=creat(nr);
    end;
  creat:=newnode;
  end;
  end;

procedure Prn_tree(t:ref; k:integer);
 var
  i:integer;
 begin
 { TODO -oUser -cConsole Main : Insert code here }
  if t<>nil then
    with t^ do
     begin
     Prn_tree(left,k+1);
      for i:=1 to k do
       write('****');
       writeln(key:5);
      Prn_tree(right,k+1);
     end;
   end;

   procedure sravnenie(m:array {[1..i]} of integer;i:integer);
  var z,n,a:integer;
 begin
 z:=1;
 a:=m[1];
 //z:=1;
 if z<=i then begin
 if m[z]>a then begin
 a:=m[z];
 end;
 z:=z+1;
 end;
 writeln(a);
 readln;
 end;



 procedure glybina(t:ref; k:integer);
 var
  i:integer;
  m:array of integer;
 begin
 { TODO -oUser -cConsole Main : Insert code here }
  if t<>nil then
    with t^ do
     begin
     Prn_tree(left,k+1);
      m[i]:=k;
      i:=i+1;
       writeln(key:5);
      Prn_tree(right,k+1);
     end;
    sravnenie(m,i);
   end;

procedure summ2(r:array of integer;j:integer);
 var w:integer;
 begin
 s:=0;
 //w:=1;
 for w:=1 to j do
 begin
 s:=s+r[w];
 end;
 writeln('summ');
 writeln(s);
 end;

 procedure summ(var t:ref; m:integer);
 {var
 r:array of integer;
 j:integer; }
 begin
 if t <> nil then {with t^ do} begin
  summ(t^.left,m+1);
  l:=t^.key;
  r[j]:=l;
  j:=j+1;
  summ(t^.right,m+1);
  end;
 summ2(r,j);
 end;
{procedure infix(t:ref);
var o,a,k,i:integer;
begin
if t<>nil then
    with t^ do
     begin
     Prn_tree(left,k+1);
      for i:=1 to k do
       write('****');
       writeln(key:5);
       a:=a+1;
      Prn_tree(right,k+1);
      writeln(a);
     end;
     end;}

procedure poisc(var t:ref;m:integer; c:integer);

begin

if t<> nil then with t^ do begin
 poisc(left,m+1,c);
 if key=c then begin
 y:=y+1;
 end;
 poisc(right,m+1,c);
 end;
 end;

procedure saveall(t:ref);
 begin
 if t^.left<>nil then saveall(t^.left);
 writeln(f,t^.key);
 if t^.right<>nil then saveall(t^.right);
 end;

procedure savefile(t:ref);
 var e:string;
 begin
  writeln('vvedite imya faila:');
  readln(e);
  assignfile(f,e);
  rewrite(f);
  saveall(nn);
  closefile(f);
end;



procedure count(t:ref; k:integer);
var m:array of integer;
i:integer;
 begin
 if t^.right<>nil then begin
  k:=k+1;
  count (t^.right,k);
  end
  else begin
  m[i]:=k;
  i:=i+1;
  k:=k-1;
  end;
  if t^.left<>nil then begin
  count (t^.left,k);
  k:=k+1;
  m[i]:=k;
  i:=i+1;
  end;
  sravnenie(m,i);
  end;

{procedure sravnenie(m:array [1..i] of integer;y:integer);
  var z,n:integer;
 begin
 n:=1;
 if z+n<=i then begin
 if m[z]<m[z+n] then begin
 n:=n+1;
 m[z]:=m[z+n];
 end
 else begin
 m[z+n]:=m[z+n+1];
 n:=n+1;
 end;
 end
 else
 writeln();
 end;}

procedure done (var t:ref);
 begin
 if t<>nil then
  begin
   with t^ do begin
    done(left);
    done(right);
   end;
  dispose(t);
 end;
end;

var q,d,c,h:integer; t:ref;
begin

{ref:=nil;
write('vvedite imya faila:');
readln(e);
assignfile(f,e);
reset(f);
while not eof(f) do
begin
  readln(e);
  addnewr(ref,e);
  end;
  closefile(f);}

repeat
writeln('*********************************************');
writeln('menu');
writeln('1. sozdanie dereva');
writeln('2. kolichestvo elementa v dereve');
writeln('3. summa elementov dereva');
writeln('4. srednee arifmeticheskoe elementov dereva');
writeln('5. max glybina dereva');
writeln('6. vivod dereva');
writeln('7. soxranit v fail');
writeln('8. zavershenie raboti');
writeln('9. vixod');
writeln('*********************************************');
writeln; readln(q);
case q of
1:
begin
writeln('vvodim sami ili po randomy?');
writeln('1-sami');
writeln('2-po randomy');
writeln('vash vibor');
readln(h);
if h=1 then
begin
writeln('vvedite colichestvo yzlov dereva');
 readln(n);
 nn:=Creat(n);
 writeln('derevo sozdano');
 end
else
begin
 writeln('vvedite colichestvo yzlov dereva');
 readln(n);
 nn:=Creat_tree(n);

 writeln('derevo sozdano');
  end;
 readln;
 end;

2:begin
y:=0;
writeln('vvedite chislo');
readln(c);

poisc(nn,0,c);
writeln('colichestvo');
writeln(y);
readln;
end;

3:
begin
j:=1;
summ(nn,0);
//writeln(s);
end;

5:
begin
//glybina(nn,0);
count(nn,0);
writeln('max glybina');
//writeln(a);
readln;
end;

6:
begin
writeln('tree':10);
  prn_tree(nn,0);
end;
7:

savefile(nn);

8:
begin
done(nn);
writeln('derevo ynichtojeno');
end;

end;
until  q=9;
end.



M
alexeis1
Модератор: выбирайте тип подсветки. Если что не ясно, то почитайте здесь как это делать http://forum.vingrad.ru/index.php?showtopic=126445


Это сообщение отредактировал(а) alexeis1 - 17.12.2006, 16:30
PM MAIL ICQ   Вверх
brodaga163
Дата 14.6.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 14.6.2008

Репутация: -1
Всего: нет



ребята, пожалуйста помогите сделать один пункт в создании дерева...надо  написать процедуру удаления всего под деревом- если это лист-удалить лист, уесли целая ветка-удалить целиком всю 
 плиз отправьте что получилось на [email protected] буду очень признателен 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0717 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.