Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры Данных_модули.DOC
Скачиваний:
22
Добавлен:
23.06.2014
Размер:
84.99 Кб
Скачать

Модули для лабораторных работ.

Unit URegTabl; {упорядоченная таблица на массиве}

Interface

Const tablsize = 100; {размер таблицы}

tablok = 0; {успешное завершение операции}

tablover = 1; {таблица переполнена}

tablunder = 2; {таблица пуста}

tablelnotfound = 3; {элемент не найден}

Type Index = 0..TablSize;

BaseType = Word;

Element = record

k:Integer;

v:BaseType;

end;

Tabl = record

buf:array [Index] of Element;

uk:Index; {указатель на последний элемент}

end;

Var TablError:byte;

Procedure InitTabl (var T:Tabl); {конструктор}

Function EmptyTabl (var T:Tabl):boolean; {таблица пуста?}

Function FullTabl (var T:Tabl):boolean; {таблица переполнена?}

Procedure PutTabl (var T:Tabl; El:Element); {включение элемента}

Function GetTabl (var T:Tabl; var El:Element; key:integer):boolean; {исключение элемента}

Function LineFind (var T:Tabl; key:integer; var El:Element; var n:Index): boolean; {линейный поиск}

Function FastLineFind (var T:Tabl; key:integer; var El:Element; var n:Index): boolean; {быстрый линейный поиск}

Function BinFind (var T:Tabl; key:integer; var El:Element; var n:Index): boolean; {бинарный поиск}

Implementation

Procedure InitTabl;

var i:index;

Begin

T.uk:=0;

TablError:=2

End;

Function EmptyTabl;

Begin

if T.uk=0 then TablError:=tablunder;

emptytabl:=T.uk=0;

End;

Function FullTabl;

Begin

if T.uk=TablSize then TablError:=tablover;

FullTabl:=T.uk=TablSize;

End;

Procedure PutTabl;

var i:byte;

n:Index;

Begin

if not(FullTabl(t)) then

if not(BinFind(T,el.k,el,n)) then {элемента в таблице нет}

begin

Inc(T.uk);

for i:=T.uk downto n+1 do T.buf[i]:=T.buf[i-1];

T.buf[n]:=el;

TablError:=TablOk;

end;

End;

Function GetTabl;

Var I:byte;

n:Index;

Begin

if not(EmptyTabl(T)) then

if BinFind(T,key,el,n) then

begin

el:=T.buf[n];

for i:=n to T.uk-1 do T.buf[i]:=T.buf[i+1];

Dec(T.uk);

TablError:=TablOk;

end

else TablError:=TablElNotFound;

End;

Function LineFind;

Var I:Index;

Begin

i:=0;

TablError:=tablelnotfound;

while (i<T.uk) and (TablError=tablelnotfound) do

begin

if T.buf[i].k=key then

begin

TablError:=tablok;

el:=T.buf[i];

n:=i;

end;

Inc(i);

end;

LineFind:=TablError=tablok;

End;

Function FastLineFind;

Var I:byte;

f:boolean;

Begin

f:=false;

i:=0;

T.buf[T.uk+1].k:=key;

While not(f) do

begin

if T.buf[i].k=key then

begin

f:=true;

el:=T.buf[i];

n:=i;

end;

Inc(i);

end;

if n=T.uk+1 then TablError:=tablelnotfound

else TablError:=TablOk;

FastLineFind:=TablError=tablok;

End;

Function BinFind;

var i,j,k:Index;

f:boolean;

Begin

i:=0;

j:=T.uk-1;

f:=false;

repeat

k:=(i+j) div 2;

if T.buf[k].k=key then

begin

f:=true;

el:=T.buf[i];

end;

if T.buf[k].k>key then i:=k+1

else j:=k-1;

until f or (i>j);

if f then TablError:=tablok

else begin

n:=i;

TablError:=tablelnotfound;

end;

End;

End.

{---------------------------------------------------------------------------}

Unit UNRegTab;{неупорядоченная таблица на массиве}