Построение двусвязанного списка осуществляется аналогично построению односвязанного списка. Особенностью двусвязанного списка является то, что в первой записи списка поле Next содержит адрес второго элемента списка, а поле Pre следует сделать равным Nil. И наоборот, в последней записи поле Next содержит Nil, а поле Pre – адрес предпоследнего элемента. В этом случае в программе требуется отслеживать уже три указателя: первую запись в списке, адрес текущей записи и последнюю запись.
procedure NewListRec;
var i:integer;
begin
New(List); {выделить память для первой записи }
{заполнить информационные поля}
BegList^.Name:=concat('person1');
BegList^.phone:='01';
BegList^.Pre:= nil;
CurrentRec := BegList;{сделать первую запись те-кущей}
for i:=2 to n do
begin
{ выделить память для следующей записи }
New(CurrentRec^.Next);
str(i,s);
CurrentRec^.Next^.Name:=concat('person',s);
CurrentRec^.Next^.phone:=concat('0',s);
CurrentRec^.Next^.Pre:=CurrentRec;
{ сделать следующую запись текущей }
CurrentRec := CurrentRec^.Next;
end;
{ после последней записи следующей нет }
CurrentRec^.Next := nil;
EndList:=CurrentRec;
end;
Перемещение по списку, удаление списка и освобождение динамической памяти производится аналогично односвязанному списку. |