Implementation
//-----------------------------------------------------------------------------
function Next(a: PNode):PNode;
begin
if a = nil then begin Result:= nil; exit end
else Result:= a^.next;
end;
//-----------------------------------------------------------------------------
function Last(L: List):PNode;
begin
Result:= L;
if L = nil then exit
else while Result^.next <> nil do
Result:= Next(Result);
end;
//-----------------------------------------------------------------------------
function PredLast(L: List; var p: PNode):PNode;
begin
Result:= L;p:= L;
if L = nil then exit;
if L^.next = nil then exit
else while Result^.next <> nil do
begin
p:= Result;
Result:= Next(Result)
end;
end;
//-----------------------------------------------------------------------------
function Number(L: List): Cardinal;
begin
Result:= 0;
while L <> nil do
begin
L:= Next(L);
inc(Result);
end;
end;
procedure AddR(var L: List; a: T);
var p,r,k:PNode;
begin
if l=nil then l:=createE(a)
else
begin
r:=l;
p:=last(l);
l:=createE(a);
k:=l;
l:=p;
l.next:=k;
l:=r;
end;
end;
//-----------------------------------------------------------------------------
procedure AddL(var L: List; a: Integer);
var p: PNode;
begin
if l=nil
then
l:=createE(a)
else
begin
p:=l;
l:=createE(a);
l^.next:=p;
end;
end;
//-----------------------------------------------------------------------------
function H(var L: List): T;
var p: PNode;
begin
p:=l^.next;
result:=l^.key;
dispose(l);
l:=p;
end;
//-----------------------------------------------------------------------------
function H_(var L: List): T;
var k:list;
begin
if l.next=nil then
begin
result:=l.key;
empty(l);
end
else
begin
k:=l;
l:=tail_(k);
result:=k.key;
end;
end;
//-----------------------------------------------------------------------------
function Tail(var L: List): List;
begin
if l=nil then result:=nil
else if l^.next<>nil then
begin
result:=l^.next;
l^.next:=nil;
end
else result:=nil;
end;
//-----------------------------------------------------------------------------
function Tail_(var L: List): List;
Var p:pnode;
begin
result:=l;
p:=result;
l:=predlast(result,result);
result.next:=nil;
result:=p;
end;
//-----------------------------------------------------------------------------
procedure Empty(var L: List);
// Операция Опустошить. Опустошает список.
Var p: pNode;
begin
while l<>nil do
begin
p:=l^.next;
dispose(l);
l:=p;
end;
end;
//-----------------------------------------------------------------------------
procedure Merge(var L,N: List);
Var k:pnode;
begin
k:=l;
l:=last(l);
l.next:=n;
l:=k;
end;
//-----------------------------------------------------------------------------
function ListToStr(L: List): String;
//Опрация. СписокВСтроку. Формирует строку, содержащую элементы списка
begin
if l = nil then result:='List empty'
else
begin
while l <> nil do
begin
result:=result+','+inttostr(l^.key);
l:=l.next;
end;
delete(result,1,1);
end;
end;
//-----------------------------------------------------------------------------
function EToStr(a: PNode): String;