Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Pascal / Delphi / Основы программирования и алгоритмические языки [33].DOC
Скачиваний:
33
Добавлен:
02.05.2014
Размер:
434.18 Кб
Скачать

П.6.3.2. Проверка возможности размещения записи в куче

{Проверка возможности непрерывного размещения записи в куче}

Uses CRT;

Type Rec=

Record

Name : String[30];

Address : String[20];

Sex : char;

age : byte;

End;

Var p: ^Rec;

Begin

ClrScr;

if MaxAvail < SizeOf(Rec) then

Writeln('НЕ хватает памяти для записи Rec!!!!!!')

else

begin

{ Распределение памяти в «куче» определенного размера и получение адреса P }

GetMem(p, SizeOf(Rec));

Writeln('Память под запись Rec удалось непрерывно разместить в куче.....');

{

Рис. П.6.11. Состояние кучи.

}

{ ... Использование динамической памяти, обработка записи Rec... }

{ Освобождение динамической памяти, начиная с адреса P }

FreeMem(p, SizeOf(Rec));

{

Рис. П.6.12. Исходное состояние кучи.

}

end;

Readln

End.

П.6.3.3. Организация очереди

{Очередь - FiFo (First In - First Out) - первый вошел, первый вышел}

Uses CRT;

Type Pointer=^Line;

Line=Record

Inf : Integer;

Next :Pointer

End;

Var Head, {голова очереди}

Tail, {хвост}

First,{очередной первый элемент в очереди}

PointerNew, P : Pointer;

f : Boolean;

{Вставить в очередь целое число}

Procedure PutInLine(Var Head, NewP, Tail : Pointer);

Var a: Real;

Begin

f:=True;

Repeat

Write('Введите целое число====>');

{$I-}

Readln(a);

{$I+}

if IOResult<>0 then {Признак окончания ввода - НЕ числовой символ}

begin

f:=False;

Exit;

end;

Until (IOResult=0)and(a>=-32768)and(a<=32767);

New(NewP);

if Head=Nil Then {Очереди еще нет. Создаем ее.}

Head:=NewP

{

Рис. П.6.13. Первый элемент в очереди.

}

else Tail^.Next:=NewP; {Очередь уже есть - становимся в хвост очереди}

Tail:=NewP; {Новый хвост очереди}

NewP^.Inf:=trunc(a);

NewP^.Next:=Nil;

{

Рис. П.6.14. Образование нового элемента в очереди.

}

{

Рис. П.6.15. Общий вид очереди.

}

End;

{Чтение информации из очереди}

Procedure GetOutLine;

Begin

First:=Head;

if First<>Nil then

begin

Head:=First^.Next;

Write(First^.Inf,' ');

end

End;

Begin

ClrScr;

Head:=Nil; {Очереди пока нет}

Mark(P); {отметка начала кучи - адрес P}

Writeln('============== Создание очереди ======================');

Writeln('Признак окончания ввода - НЕ числовой символ');

Repeat PutInLine(Head, PointerNew, Tail) Until not f;

Writeln('============== Содержимое очереди ============');

if Head=Nil then

begin

Writeln('Очередь пуста...');

Readln;

Readln;

Exit

end;

First:=Head; {Установка указателя в начало очереди - голова очереди}

While First<>Nil do GetOutLine;

Readln;

Readln;

Release(P);{Освобождение кучи, начиная с адреса P}

End.