Удаление звена из произвольного места списка, отличного от начала (после звена, указатель на которое задан)

Добавление звена в произвольное место списка, отличное от начала (после звена, указатель на которое задан)

{Процедура добавления звена в список после звена, на которое ссылается указатель 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.  

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: