Дано число N (> 0) и указатели P1 и P2 на начало и конец непустой очереди (двунаправленного/двусвязного списка). Извлечь из очереди N начальных элементов и вывести их значения (если очередь содержит менее N элементов, то извлечь все ее элементы). Вывести также новые адреса начала и конца очереди (для пустой очереди дважды вывести NIL) — Pascal(Паскаль)

{Работа с двусторонней очередью}
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.

Leave a Comment

63 + = 64