Реализация ОДНОНАПРАВЛЕННОГО СПИСКА на базе ссылок.
7.1 Реализация.
1) Сделать список пустым.(Процедура)
2) Проверить наличие элементов в списке.(Функция)
3) Добавить элемент в начало,середину или конец списка.(Процедура)
4) Взять элемент из начала или конка списка.(Процедура)
5) Удалить элемент из списка.(Процедура)
6) Удалить список.(Процедура)
7.2 Процедуры и функции.
7.2.1 Основные типы и переменные :
Пусть Type InformType=byte;{Информационная часть}
LPtr=^spisok;
spisok=record
Inf:InformType;
next:LPtr;
end;
var a:Lptr;
7.2.2 Алгоритмы :
{Cписок пуст или нет}
function NilExist(a:Lptr):boolean;
begin
NilExist:=a=nil;
end;
{Устанавливает указатель в начало списка}
procedure SetToHome(a:LPtr;var b:LPtr);
begin
b:=a;
end;
{Устанавливает указатель в конец списка}
procedure SetToEnd(a:LPtr;var b:LPtr);
begin
if a=nil then b:=nil else begin
b:=a;
while b^.next<>nil do
b:=b^.next
end;
end;
{Возвращает адрес предъидущего элемента}
procedure Sprev(a,p:LPtr;var b:LPtr);
var n:Lptr;
begin
b:=nil;
if(a<>nil)and(a<>p)and(a^.next<>nil)then
else begin n:=a;
while(n^.next<>nil)and(b=nil)do begin
if n^.next=p then b:=n;
n:=n^.next;
end;
end;
end;
{Передвигает указатель на 1 эл-т вперед}
procedure Mov1(var a:LPtr);
begin
if(a<>nil)then a:=a^.next
end;
{Передвигает указатель на 1 эл-т назад}
procedure Mov2(var a,b:LPtr);
var n:LPtr;
begin
Sprev(a,b,n);
b:=n;
end;
{Добавить элемент в начало}
procedure AddElemToHome(var a:Lptr;inf:InformType);
var n:Lptr;
begin
new(n);
n^.inf:=inf;
n^. next:=a;
a:=k
end;
{Добавить элемент в конец}
procedure AddElemToEnd(var a:Lptr;inf:InformType);
var k,n:lptr;
begin
SetToEnd(a,n);
new(k);
k^.inf:=inf;
k^.next:=nil;
n^.next:=k;
end;
{Добавить элемент в середину}
procedure AddToMid(var a:Lptr;inf:InformType);
var m,n:lptr;
begin
if p<>nil then
begin
new(n);
n^.inf:=inf;
m:=m^.next;
p^.next:=n;
n^.next:=m;
end;
end;
{Взять элемент из начала}
procedure GetElemHome(p:Lptr;var inf:InformType);
begin
if p<>nil then inf:=p^.inf
end;
{Взять элемент из kонца(a- указывает на начало)}
procedure GetElemEnd(a:Lptr;var inf:InformType);
var n:lptr;
begin
SetToEnd(a,n);
if n<>nil then inf:=n^.inf
end;
{Удалить элемент из начала}
procedure DelElemHome(Var a:LPtr);
var n:Lptr;
begin
if a<>nil then
begin
n:=a;
a:=a^.next;
dispose(n);
end;
end;
{Удалить элемент из конца списка.}
procedure DelElemEnd(Var a:Lptr);
var m,n:Lptr;
begin
if a<>nil then
begin
if a^.next=nil then
begin dispose(a);
a:=nil;
end
else
begin
SetToEnd(a,m);
Sprev(a,m,n);
n^.next:=nil;
dispose(m);
m:=nil;
end;
end;
end;
{Удалить элемент из середины списка.}
procedure DelElemMid(Var a,p:Lptr);
var l:Lptr;
begin
if a=p then
DelElemHome(a)
else begin
SetToEnd(a,l);
if p=l then
DelElemEnd(a)
else begin
Sprev(a,p,l);
l^.next:p^.next;
dispose(p);
P:=nil;
end;
end;
end;
{Сделаем список Пустым.}
procedure Delsp(var a:Dt);
begin
while a<>nil do DelElemHome(a);
end;