так что, как вы можете видеть, я пытаюсь сделать процедуру для обращения связанного списка, вот код и записи списка и узла, я получаю только первый номер списка, и я думаю, что это может быть потому, что pre имеет значение null, а заголовок (Current) указывает на null, но я не уверен и не знаю, как это решить, спасибо.
Type Node;
Type List is access Node;
Type Node is record
Info: Integer;
nx: List;
end record;
procedure reverselist (L: in out List) is
Current: List:=L ;
Pre: List:=null;
Next: List:=null;
begin
if Current.nx /= null then
while Current.nx /= null loop
Next:= Current.nx;
Current.nx:= Pre;
Pre:= Current;
Current:= Next;
end loop;
end if;
end reverselist;
@JeffreyR.Carter Извините, я перевел код и забыл заменить фактическое на текущее
if Current /= null then
while Current.nx /= null loop
Next:= Current.nx;
Current.nx:= Pre;
Pre:= Current;
Current:= Next;
end loop;
Next:= null;
Current.nx:= Pre;
L:= Current;
end if;
Я бы начал с того, что просто несколько раз удалил голову из списка и построил ее обратно в обратном порядке:
procedure Reverse_List (L : in out list) is
Temp : List := null; -- Holds a "popped" head
Head : List := null; -- This is the head of the reversed list
begin
while L /= null loop
Temp := L; -- Pop the head of the list off
L := L.nx; -- Set the list head to the next item
Temp.nx := Head; -- Attach the popped node to the reversed head
Head := Temp; -- Reset the reverse head to the new node
end loop;
L := Head; -- Now set the input list pointer to the newly reversed list
end Reverse_List;
Полная программа испытаний:
with Ada.Text_IO; use Ada.Text_IO;
procedure Hello is
Type Node;
Type List is access Node;
Type Node is record
Info: Integer;
nx: List;
end record;
procedure Reverse_List (L : in out list) is
Temp : List := null; -- Holds a "popped" head
Head : List := null; -- This is the head of the reversed list
begin
while L /= null loop
Temp := L; -- Pop the head of the list off
L := L.nx; -- Set the list head to the next item
Temp.nx := Head; -- Attach the popped node to the reversed head
Head := Temp; -- Reset the reverse head to the new node
end loop;
L := Head; -- Now set the input list pointer to the newly reversed list
end Reverse_List;
nodes : array (1..5) of List :=
(new Node'(Info => 1, nx =>null),
new Node'(Info => 2, nx =>null),
new Node'(Info => 3, nx =>null),
new Node'(Info => 4, nx =>null),
new Node'(Info => 5, nx =>null));
procedure Print(L : List) is
C : List := L;
begin
while C /= null loop
Put_Line(C.Info'Image);
C := C.nx;
end loop;
end Print;
L : List := nodes(1);
begin
Put_Line("Hello, world!");
nodes(1).nx := nodes(2);
nodes(2).nx := nodes(3);
nodes(3).nx := nodes(4);
nodes(4).nx := nodes(5);
Put_Line("Before:");
Print(L);
New_Line(2);
Put_Line("After:");
Reverse_List(L);
Print(L);
end Hello;
Выход:
$gnatmake -o hello *.adb
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali -o hello
$hello
Hello, world!
Before:
1
2
3
4
5
After:
5
4
3
2
1
В дальнейшем также учитывайте удобство двусвязных списков , таких как Ada.Containers.Doubly_Linked_Lists. Учитывая экземпляр пакета для Integer
,
package Integer_Lists is new Doubly_Linked_Lists (Integer);
use Integer_Lists;
Процедура Reverse_List
может пройти по списку в reverse
, как обсуждалось в Итерация , чтобы создать новый перевернутый список. Сравните этот подход с Reverse_List @Jere.
procedure Reverse_List (L : in out List) is
T : List;
begin
for E of reverse L loop
T.Append (E);
end loop;
L := T;
end Reverse_List;
В качестве альтернативы копированию элементов пакет также предлагает Reverse_Elements
, который «переупорядочивает элементы Container
в обратном порядке».
Reverse_Elements (L);
Полный пример:
with Ada.Containers.Doubly_Linked_Lists; use Ada.Containers;
with Ada.Text_IO; use Ada.Text_IO;
procedure DLL is
package Integer_Lists is new Doubly_Linked_Lists (Integer);
use Integer_Lists;
procedure Reverse_List (L : in out List) is
T : List;
begin
for E of reverse L loop
T.Append (E);
end loop;
L := T;
end Reverse_List;
procedure Print (L : List) is
begin
for E of L loop
Put_line (Integer'Image (E));
end loop;
end Print;
L : List;
begin
L.Append (1);
L.Append (2);
L.Append (3);
Put_line ("Before:");
Print (L);
--Reverse_List(L);
Reverse_Elements (L);
Put_line ("After:");
Print (L);
end DLL;
Консоль:
Before:
1
2
3
After:
3
2
1
Реализация Reverse_Elements
показана здесь.
Что такое
Current
?