在此代码中,我建立了一个由三个整数(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;
答案 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;