如何使用递归删除元素?

时间:2020-10-15 15:25:17

标签: ada

在此代码中,我建立了一个由三个整数(5、10、15)组成的列表,需要帮助的是,我需要询问用户他/她要删除哪些元素,然后只返回剩下的元素。我需要为此编写一个子程序,只需使用递归,就需要删除用户不需要的元素。

主程序:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Linked_List; use Linked_List;

procedure Main_Remove is
I : Integer;
L : List_Type;
begin
Build_Test_List(L); -- builds a list of 3 integers (5 => 10 => 15)
Put(L);
Put("Which elements do you want to remove/delete ");
Get(I);
Remove(L, I);
Put(L);
end Main_Remove;

包装:

package Linked_List is
type List_Type is private;
procedure Put(Item : in List_Type);
procedure Build_Test_List(Item :    out List_Type;
             Base : in     Integer := 5);
private
type E_Type;
type List_Type is access E_Type;
type E_Type is
record
Data : Integer;
Next : List_Type;
end record;
end Linked_List;

包体:

with Ada.Text_IO;       use Ada.Text_IO;
with Ada.Integer_Text_IO;   use Ada.Integer_Text_IO;
with Ada.Unchecked_Deallocation;

package body Linked_List is

procedure Put(Item : in List_Type) is
  P : List_Type := Item;
begin
Put("Listan: ");
while P /= null loop
if P /= Item then
Put(" -> ");
end if;
Put(P.Data, Width => 0);
P := P.Next;
end loop;      
New_Line;
end Put;
procedure Insert_First(L : in out List_Type;
          D : in     Integer) is
begin
L := new E_Type'(Data => D, Next => L);
end Insert_First;

procedure Build_Test_List(Item :    out List_Type;
             Base : in     Integer := 5) is
begin
  for I in reverse 1..3 loop
 Insert_First(Item, Base * I);
  end loop;
end Build_Test_List;  
end Linked_List;

1 个答案:

答案 0 :(得分:2)

这样会有所保留,特别是内存泄漏。

procedure Remove (L : in out List_Type; Item : Integer) is
begin

当列表为空时,必须停止递归。

  if L = null then
     return;
  end if;

列表不为空。接下来的操作取决于当前列表元素是否包含我们要查找的值。

  if L.Data = Item then

此项目需要从列表中删除。为此,请更改原始指针(来自列表头或上一个元素)以跳过该元素,然后处理该元素。
这是发生内存泄漏的地方。显然,需要释放开头的L所指向的单元格,但您必须注意操作顺序。

     L := L.Next;
     Remove (L, Item);
  else

该项目保留在列表中,继续下一个元素。

     Remove (L.Next, Item);
  end if;
end Remove;