{Работа с двусторонней очередью}
TYPE
PQueue = ^TQueue;
TQueue = record
value: Integer;
next : PQueue;
prev : PQueue;
end;
{Процедура для преобразования адреса в строку}
const HexChars: String = '0123456789ABCDEF';
function ToHex(p: Pointer): String;
{Преобразует адрес в строку}
var s1, s2: String; i: Integer;
begin
if p = nil then begin
ToHex := 'NIL';
Exit;
end;
s1:= ''; s2:= '';
for i:=1 to 4 do begin
s1 := HexChars[longint(p) mod 16 + 1] + s1;
longint(p) := longint(p) div 16
end;
for i:=1 to 4 do begin
s2 := HexChars[longint(p) mod 16 + 1] + s2;
longint(p) := longint(p) div 16
end;
ToHex := s2+':'+s1
end;
VAR p1, p2, p: PQueue;
{p - будет использовано для показа содержимого очереди}
i, N: Integer;
BEGIN
{Для контроля правильности работы программы }
WriteLn('----------- Свободная память ', MemAvail,' ---------');
{Создадим очередь}
New(p1); p1^.value := 0; p1^.prev := nil; p1^.next := nil;
p2 := p1;
{Добавим в начало}
for i:=1 to 10 do begin
New(p1^.prev);
p1^.prev^.value := i;
p1^.prev^.prev := nil;
p1^.prev^.next := p1;
p1 := p1^.prev
end;
{Добавим в конец}
for i:=1 to 10 do begin
New(p2^.next);
p2^.next^.value := -i;
p2^.prev^.prev := p2;
p2^.next^.next := nil;
p2 := p2^.next
end;
{показ очереди}
WriteLn('Содержимое очереди');
p:=p1;
WriteLn('Адрес начала очереди p1 = ', ToHex(p1));
while p <> nil do begin
write(p^.value:4,' ');
p := p^.next;
end;
WriteLn;
WriteLn('Адрес конца очереди p2 = ', ToHex(p2));
{Теперь задание}
Write('Введите число элементов N, которое должно быть удалено: ');
{$I-} ReadLn(N); {$I+}
if IOResult <> 0 then begin
WriteLn('Был неправильный ввод. Положим N = 10');
N := 10
end;
while ((p1 <> nil) and (N > 0)) do begin
Write(p1^.value:4,' ');
p := p1^.next;
Dispose(p1);
p1 := p;
if p1 = nil then p2 := p1;
dec(N)
end;
WriteLn;
{показ очереди}
WriteLn('Содержимое очереди');
p:=p1;
WriteLn('Адрес начала очереди p1 = ', ToHex(p1));
while p <> nil do begin
write(p^.value:4,' ');
p := p^.next;
end;
WriteLn;
WriteLn('Адрес конца очереди p2 = ', ToHex(p2));
{освобождение памяти от остатков очереди}
while p1 <> nil do begin
p2 := p1^.next;
Dispose(p1);
p1 := p2
end;
WriteLn('----------- Свободная память ', MemAvail,' ---------');
END.
Похожие записи/страницы:
- Работа с очередью: каждая операция создание, удаление, добавление,показ элементов очереди разделены на отдельные…
- Дана последовательность из n неотрицательных целых чисел. На каждом шагу эти числа упорядочивают по возрастанию…
- Написать программу, использующую подпрограмму для преобразования введенного с клавиатуры двоичного числа в…
- Написать программу для перевода числа, представленного в системе счисления с основанием S, в системы счисления с…
- Написать программу, использующую подпрограмму, для преобразования введенного с клавиатуры десятичного числа в…
- Найдите целые числа, меньшие n, которые при возведении в квадрат дают палиндромы - Pascal(Паскаль)
- Составить программу, которая переводит десятичное число в 16-ричного вида. Решить задачу с помощью процедур и…
- Дано натуральное число п. Вычислить: 1*2 + 2*3*4 + … + n*(n + 1) *…*2n - Pascal(Паскаль)