IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Бинарное дерево-уход в бесконечный циклр, Stack overflow error
Pessimist
сообщение 22.01.2009 3:03
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Англо-русский словарь построен как бинарный список (двоичное
дерево).
Каждая компонента содержит английское слово, соответствующее
ему русское слово и счетчик количества обращений к данной компонен-
те.
Первоначально бинарный список был сформирован согласно английс-
кому алфавиту. В процессе эксплуатации словаря при каждом обращении
к компоненте в счетчик обращений добавлялась единица.

Составить программу, которая:
-обеспечивает начальный ввод словаря с конкретными значениями
счетчиков обращений;
-формирует новое представление словаря в виде двоичного дерева
по следующему алгоритму:
а) в старом словаре ищется компонента с наибольшим значением
счетчика обращений;
б) найденная компонента заносится в новый словарь и удаляется
из старого;
в) переход к п. а) до исчерпания исходного словаря.

-производит распечатку исходного и нового словарей.

Указание: использовать динамические структуры.


КОД ПРОГРАММЫ:


program dynamic;
uses crt;
type rec = record
          num : word;
          eng : string;
          rus : string;
     end;
     pnode = ^node;
     node = record
         data : rec;
         left : pnode;
         right: pnode;
     end;
var root,rootnew  :pnode;
    key   :string;
    option,temp:word;
    rec1:rec;
F,Fresult:text;


procedure print_tree(p:pnode);
begin
     if p=nil then exit;
     with p^ do begin
          print_tree(right);
          write(data.eng,'    ', data.rus,'    ', data.num);
          writeln;
          write(Fresult, data.eng,'    ', data.rus,'    ', data.num);
          writeln(Fresult);
          print_tree(left);
     end
end;

function find(root:pnode; key:string; var p,parent:pnode): boolean;
begin
     p:=root;
     while p<>nil do begin
           if key=p^.data.eng then
              begin find:=true; exit end;
           parent:=p;
           if key< p^.data.eng
              then p:=p^.left
              else p:=p^.right;
           end;
           find:=false;
end;

procedure insert(var root : pnode; rec1:rec);
var p1,parent : pnode;
begin
     if find(root, rec1.eng, p1,parent) then begin
     writeln('takoi element uzhe est'); exit; end;
     new(p1);
     p1^.data :=rec1;
     p1^.left :=nil;
     p1^.right:=nil;
     if root = nil then root :=p1
     else
         if rec1.eng < parent^.data.eng
         then parent^.left :=p1
         else parent^.right :=p1;
end;

procedure del(var root:pnode;key:string);
var p      :pnode;
    parent :pnode;
    y      :pnode;

function descent(p:pnode):pnode;
var y:pnode;
    prev:pnode;
begin
     y:=p^.right;
     if y^.left = nil then y^.left:=p^.left
     else begin
          repeat
                prev:=y;y:=y^.left;
          until y^.left =nil;
          y^.left:=p^.left;
          prev^.left:=y^.right;
          y^.right:=p^.right;
     end;
     descent:=y;
end;

begin
     if not find(root, key,p,parent) then begin
        writeln('takogo el-ta net'); exit; end;
     if      p^.left = nil then y:=p^.right
     else if p^.right = nil then y:=p^.left
     else    y:=descent(p);
     if p=root then root:=y
     else
         if key < parent^.data.eng
            then parent^.left:=y
            else parent^.right:=y;;
     dispose(p);
end;

{-------------------------------------}
function max(p:pnode) : word;
var m:word;
begin
if p=nil then begin max:=0; exit end;
if ( max(p^.left) <= max(p^.right)) then
m:=max(p^.right)
else m:=max(p^.left);
if p^.data.num>m then max:=p^.data.num
else max:=m;
end;
{-------------------------------------}
function findmax(p:pnode;max:word) : pnode;
begin
     if p=nil then exit;
     with p^ do begin
     if findmax(left,max) <> nil then
     begin findmax:=findmax(left,max); exit end
     else if findmax(right,max) <>nil then
     begin findmax:=findmax(right,max); exit end
     else if data.num=max then
     begin findmax:=p; exit end
     else findmax:= nil;
     end;
end;
{-------------------------------------}

procedure move(p,pnew:pnode);
var m:word;
    p2:pnode;
    i:integer;
begin
if p=nil then exit;
for i:=1 to 3 do
begin
m:=max(p);
p2:=findmax(p,m);
writeln(p2^.data.eng);
insert(pnew,p2^.data);
del(p,p2^.data.eng);
move(p,pnew);
end;
end;




begin
root:=nil;
rootnew:=nil;
Assign(F, '15_10_in.txt');
reset(F);
   while eof(F)=false do begin
         with rec1 do begin
         readln(F, num);
         readln(F, eng);
         readln(F, rus);
         end;
         insert(root, rec1)

   end;
close(F);
assign(Fresult, '15_10_out.txt');
rewrite(Fresult);
print_tree(root);
move(root,rootnew);
close(Fresult)
end.


при попытке компиляции выдает Stack overflow error сам ошибку найти не смог, а прогу позарез к утру сделать нуна.

Очччень нуна помощщщьь

Тегами пользуйся, без них программа нечитаема абсолютно

Сообщение отредактировано: volvo - 22.01.2009 3:27
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 1.08.2025 17:47
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"