Утечка памяти - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Условие : Деревом поиска называется двоичное дерево, в котором слева от каждой вершины находятся вершины с элементами, меньшими элемента из этой вершины, а справа большими элементами. Описать функцию или процедуру, которая строит новое дерево поиска T1 из тех элементов дерева поиска Т, которое меньше величины Е.
{$I-} 
uses crt;
 
type 
  nodelink = ^node; 
  
  node = record 
    data: integer; 
    left: ^node; 
    right: ^node; 
  end;
 
var 
  c: char; 
  head: nodelink; 
  n: integer; 
  r:integer; 
  z:boolean; 
 
procedure print(node: nodelink; prefix: string);
begin
  if node <> nil then begin
    writeln(prefix,'->',node^.data);
    print(node^.left, prefix + 'L');
    print(node^.right, prefix + 'R');
  end;
end;
 
procedure insert(data: integer; var node: nodelink); 
begin 
  if node = nil then begin 
    new(node); 
    node^.data := data; 
    node^.left := Nil; 
    node^.right := Nil; 
  end else if data < node^.data then 
    insert(data, node^.left) 
  else if data > node^.data then 
    insert(data, node^.right); 
end; 
 
procedure print(node: nodelink); 
begin 
  if node <> Nil then begin 
    print(node^.left); 
    write(' ', node^.data); 
    print(node^.right); 
  end; 
end; 
 
function build(t: nodelink; e: integer):nodelink; 
begin 
  if t = Nil then
    build := Nil 
  else if t^.data < e then begin 
    build := t; 
    build^.right := build(t^.right, e); 
  end else if t^.data = e then begin 
    build := t^.left; 
  end else if t^.data > e then 
    build := build(t^.left, e); 
end; 
 
procedure deleteTree(var Tree: NodeLink); 
begin 
  if Tree <> nil then begin 
    deleteTree(Tree^.left); 
    deleteTree(Tree^.right); 
    dispose(Tree); 
    Tree:=nil;
  end; 
end; 
 
begin
  writeln('BEFORE ',getheapstatus.TotalAllocated);
  readkey;  
  repeat 
    head := Nil; 
    z := false; 
    writeln('Vvedite elementy dereva'); 
    repeat 
      read(n); 
      r := IOResult; 
      if r <> 0 then begin 
        writeln('Error'); 
        z:=true 
      end else if n <> -1 then 
        insert(n, head); 
    until (n = -1) or z; 
 
    if not z then begin 
      print(head, '');
      writeln(); 
 
      writeln('Vvedite element e'); 
      repeat 
        read(n); 
        r := IOResult; 
        if r <> 0 then begin 
          writeln('Error'); 
          z:=true; 
        end; 
      until (r = 0) or z; 
 
      if not z then begin 
        head := build( head, n );
        print(head, '');
        writeln(); 
      end; 
    end;  
    readln(); deleteTree(head);
    writeln('Hotite prodolzhit? (y)'); 
    read(c); 
  until c <> 'y'; deleteTree(head); dispose(head);
  writeln('AFTER ',getheapstatus.TotalAllocated);  
  readkey; 
end.

Решение задачи: «Утечка памяти»

textual
Листинг программы
{$I-}
uses crt;
 
type
  nodelink = ^node;
 
  node = record
    data: integer;
    left: ^node;
    right: ^node;
  end;
 
var
  c: char;
  head, b: nodelink;
  n: integer;
  r:integer;
  z:boolean;
 
procedure print(node: nodelink; prefix: string);
begin
  if node <> nil then begin
    writeln(prefix,'->',node^.data);
    print(node^.left, prefix + 'L');
    print(node^.right, prefix + 'R');
  end;
end;
 
procedure insert(data: integer; var node: nodelink);
begin
  if node = nil then begin
    new(node);
    node^.data := data;
    node^.left := Nil;
    node^.right := Nil;
  end else if data < node^.data then
    insert(data, node^.left)
  else if data > node^.data then
    insert(data, node^.right);
end;
 
procedure print(node: nodelink);
begin
  if node <> Nil then begin
    print(node^.left);
    write(' ', node^.data);
    print(node^.right);
  end;
end;
 
procedure build(var b : nodelink; t: nodelink; e: integer);
begin
  if t <> nil then
  begin
    if t^.data > E then // нужно идти только налево
      build(b, t^.left, E)
    else // тут нужно и направо и налево, но
    begin
      if t^.data < E then // добавлять в новое дерево - только меньшие элементы
        insert(t^.data, b);
      build(b, t^.left, E);
      build(b, t^.right, E)
    end;
  end;
end;
 
procedure deleteTree(var Tree: NodeLink);
begin
  if Tree = nil then exit;
 
  deleteTree(Tree^.left);
  deleteTree(Tree^.right);
  // writeln('removing', Tree^.data);
  dispose(Tree);
  Tree := nil;
end;
 
begin
  writeln('BEFORE ',getheapstatus.TotalAllocated);
  readkey;
  repeat
    head := Nil;
    z := false;
    writeln('Vvedite elementy dereva');
    repeat
      read(n);
      r := IOResult;
      if r <> 0 then begin
        writeln('Error');
        z:=true
      end else if n <> -1 then
        insert(n, head);
    until (n = -1) or z;
 
    if not z then begin
      print(head, '');
      writeln();
 
      writeln('Vvedite element e');
      repeat
        read(n);
        r := IOResult;
        if r <> 0 then begin
          writeln('Error');
          z:=true;
        end;
      until (r = 0) or z;
 
      if not z then begin
        b := nil;
        build(b, head, n);
        print(b, '');
        writeln();
      end;
    end;
    readln(); deleteTree(b);
    writeln('Hotite prodolzhit? (y)');
    read(c);
  until c <> 'y'; deleteTree(head); // dispose(head);
  writeln('AFTER ',getheapstatus.TotalAllocated);
  readkey;
end.

Объяснение кода листинга программы

  1. Объявлены переменные: c, head, b, n, r, z, node, nodelink, t, e, left, right, data.
  2. Определены типы: nodelink, node, integer, boolean.
  3. Создана процедура print(node: nodelink; prefix: string).
  4. Создана процедура insert(data: integer; var node: nodelink).
  5. Создана процедура print(node: nodelink).
  6. Создана процедура build(var b : nodelink; t: nodelink; e: integer).
  7. Создана процедура deleteTree(var Tree: NodeLink).
  8. Создана основная программа.
  9. Выводится информация о выделенной памяти перед началом программы.
  10. Ввод данных: ввод элементов дерева до момента, когда вводится -1 или ошибка.
  11. Если ввод не вызывает ошибку, то вызывается функция build для построения дерева.
  12. После построения дерева выводится сообщение об ошибке, если было введено -1 или ошибка во время ввода.
  13. Если ввод не вызывает ошибку, то начинается цикл, который продолжается до тех пор, пока пользователь не введет 'y'.
  14. В каждой итерации цикла происходит удаление дерева и выводится сообщение об ошибке, если было введено -1 или ошибка во время ввода.
  15. В каждой итерации цикла происходит выделение памяти для нового дерева и его построение.
  16. После построения нового дерева выводится сообщение об ошибке, если было введено -1 или ошибка во время ввода.
  17. Если ввод не вызывает ошибку, то выводится сообщение об ошибке, если было введено -1 или ошибка во время ввода.
  18. В каждой итерации цикла происходит выделение памяти для нового дерева и его построение.
  19. После построения нового дерева выводится сообщение об ошибке, если было введено -1 или ошибка во время ввода.
  20. В каждой итерации цикла происходит выделение памяти для нового дерева и его построение.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы