if (L <> nil)
then
with L^ do
case size of
0: begin
first:= CreateE(E);
last:= first;
inc(size)
end;
else
p:= CreateE(E);
p^.next:= First;
First:= p;
inc(size)
end
end;
//------------------------------------------------------------------------------
function Tail(var L: PList): PList;
//Создает список, полученный выделением элементов хвоста списка L
//и возвращает указатель на него. В L остается голова исходного списка
begin
Result:= CreateL;
if Size(L) > 1
then
with Result^ do
begin
first:= L^.first^.next;
last:= L^.last;
size:= L^.size - 1;
L^.last:= L^.first;
L^.size:= 1;
L^.first^.next:= nil;
end;
end;
//------------------------------------------------------------------------------
function Tail_(var L: PList): PList;
//Создает список, полученный выделением элементов хвоста списка L (справа)
//и возвращает указатель на него. В L остается голова исходного списка
var
p: PNode;
begin
Result:= CreateL;
if Size(L) > 1
then
with Result^ do
begin
Result^:= L^;
last:= PredLast(L,p);
last:= p;
Last^.next:= nil;
size:= L^.size - 1;
L^.first:= L^.last;
L^.size:= 1;
end;
end;
//------------------------------------------------------------------------------
function Head(L: PList): T;
//Выделяет из списка L элемент списка, который является его головой,
//и возвращает указатель на него
var p: PNode;
begin
if L = nil
then//Список не существует
exit;
with L^ do begin
if size = 0
then // Список пуст
begin raise EListEmpty.Create('Список пуст'); exit end;
Result:= first^.key;
p:= first;
first:= first^.next;
dispose(p);
dec(size);
if size = 0
then
begin last:= nil; first:= nil end
end
end;
//------------------------------------------------------------------------------
function Head_(L: PList): T;
//Выделяет из списка L элемент списка, который является его головой (справа),
//и возвращает указатель на него
var
p: PNode;
begin
if L = nil then //Список не существует
exit;
if Size(L) > 0
then //Список не пуст
with L^ do
begin
Result:= last^.key;
last:= PredLast(L,p);
dispose(last);
last:= p;
last^.next:= nil;
size:= size - 1;
if size = 0
then
begin last:= nil; first:= nil end
end
else
raise EListEmpty.Create('Список пуст');
end;
//------------------------------------------------------------------------------
procedure EmptyList(L: PList);
//Опустошает список
begin
if L <> nil then
while L^.size <> 0 do Head(L)
end;
//------------------------------------------------------------------------------
procedure Merge(L,T: PList);
//Объединяет два списка
begin
if (T = nil) and (L = nil)
then exit;
if (IsEmpty(L) and IsEmpty(T)) or IsEmpty(T) then exit;
if IsEmpty(L) and not IsEmpty(T) then
begin
L^.first:= T^.first;
L^.size := T^.size;
L^.last := T^.last;
T^.size:= 0;
T^.first:= nil;
T^.Last:= nil;
exit;
end;
with L^ do
begin
Last^.next:= T^.First;
Last:= T^.Last;
size:= T^.size + size
end;
T^.size:= 0;
T^.first:= nil;
T^.Last:= nil;
end;
//------------------------------------------------------------------------------
procedure DelList(var L: PList);
//Удаляет список из памяти
begin
if L <> nil then begin
EmptyList(L);
Dispose(L);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.