Двунаправленный список обрабатывается аналогично однонаправленному.
Выделим типовые операции:
Традиционно реализуем выделенный набор операций в виде модуля. Подключив этот модуль, можно решить большинство типовых задач на обработку двунаправленного списка.
Unit Spisok_2;
Interface
Type BT = LongInt;
U = ^Zveno;
Zveno = Record Inf : BT; N, P: U End;
Procedure V_Nachalo(Var First : U; X : BT);
Procedure Iz_Nachala(Var First : U; Var X : BT);
Procedure V_Spisok(Pred : U; X : BT);
Procedure Iz_Spiska(Pred : U; Var X : BT);
Procedure Ochistka(Var First: U);
Function Pust(First : U) : Boolean;
Procedure Print(First : U);
Procedure F(var First : U);
Implementation
Procedure V_Nachalo;
Var Vsp : U;
Begin
New(Vsp);
Vsp^.Inf := X;
Vsp^.N := First;
Vsp^.p := nil;
First := Vsp;
End;
Procedure Iz_Nachala;
Var Vsp : U;
Begin
Vsp := First;
First := First^.N;
First^.P := nil;
X := Vsp^.Inf;
Dispose(Vsp);
End;
Procedure V_Spisok;
Var Vsp : U;
Begin
New(Vsp);
Vsp^.Inf := X;
Vsp^.N := Pred^.N;
Vsp^.p := Pred;
Pred^.N := Vsp;
Pred^.N^.N^.p := Vsp;
End;
Procedure Iz_Spiska;
Var Vsp : U;
Begin
Vsp := Pred^.N;
Pred^.N := Pred^.N^.N;
Vsp^.N^.p := Pred;
X := Vsp^.Inf;
Dispose(Vsp);
End;
Procedure Ochistka;
Var Vsp : BT;
Begin
While Not Pust(First) Do Iz_Nachala(First, Vsp)
End;
Function Pust;
Begin
Pust := First = Nil
End;
Procedure Print;
Var Vsp : U;
Begin
Vsp := First;
While Vsp <> Nil Do
Begin
Write(Vsp^.Inf : 6);
Vsp := Vsp^.N
End; WriteLn
End;
Procedure F;
Var V : U; i, n: longint;
Begin
Write ('Введите количество элементов списка: '); readln(n);
New(First);
First^.N := Nil;
First^.p := Nil;
write ('введите элемент списка: '); readln(First^.Inf);
V:=First;
For i := 2 To n Do
Begin
New(V^.N);
V^.N^.p := V;
V:=V^.N;
V^.N:=Nil;
write ('введите элемент списка: '); readln(v^.Inf);
End
End;
Begin
End.
Пример. Определить в двунаправленном списке количество элементов, у которых соседи справа и слева отрицательны.
program u4_4_7;
uses spisok_2;
function solution(L: U): word;
var v: word; var W: U;
begin
W:=L^.N; v:=0;
while W^.N <> nil do
begin
if (W^.p^.inf < 0) and (W^.N^.inf < 0)
then v:= v+1;
W:= W^.N
end;
solution := v;
end;
var L: U;
begin
F(L);
print(L);
writeln(solution(L))
end.