Добавление звена в произвольное место списка, отличное от начала (после звена, указатель на которое задан)
| {Процедура добавления звена в список после звена, на которое ссылается указатель Pred;
в x содержится информация для добавления}
Procedure V_Spisok(Pred: U; X: BT);
Var Vsp: U;
Begin
New(Vsp); {Создаем пустое звено}
Vsp^.Inf:= X; {Заносим информацию}
Vsp^.Next:= Pred^.Next; {Теперь это звено ссылается на то, что было следом за звеном Pred}
Pred^.Next:= Vsp; {Теперь новое звено встало вслед за звеном Pred}
End;
|
| {Процедура удаления звена из списка после звена, на которое ссылается указатель Pred;
в x содержится информация из удалённого звена}
Procedure Iz_Spiska(Pred: U; Var X: BT);
Var Vsp: U;
Begin
Vsp:= Pred^.Next; {Забираем ссылку на удаляемое звено}
{Удаляем звено из списка, перенаправив ссылку на следующее за ним звено}
Pred^.Next:= Pred^.Next^.Next;
X:= Vsp^.Inf; {Забираем информацию из удаляемого звена}
Dispose(Vsp); {Уничтожаем звено}
End;
|
Приведём полный текст модуля.
Unit Spisok;
Interface
Type BT = LongInt;
U = ^Zveno;
Zveno = Record Inf: BT; Next: 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);
Implementation
Procedure V_Nachalo;
Var Vsp: U;
Begin
New(Vsp);
Vsp^.Inf:= X;
Vsp^.Next:= First;
First:= Vsp;
End;
Procedure Iz_Nachala;
Var Vsp: U;
Begin
Vsp:= First;
First:= First^.Next;
X:= Vsp^.Inf;
Dispose(Vsp);
End;
Procedure V_Spisok;
Var Vsp: U;
Begin
New(Vsp);
Vsp^.Inf:= X;
Vsp^.Next:= Pred^.Next;
Pred^.Next:= Vsp;
End;
Procedure Iz_Spiska;
Var Vsp: U;
Begin
Vsp:= Pred^.Next;
Pred^.Next:= Pred^.Next^.Next;
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^.Next
End; WriteLn
End;
Begin
End.
|
|