Условие задачи
Имеется описание двух типов (типизированного указателя PNode и записи TNode):

type PNode = ^TNode;
TNode = record
Data: integer;
Next: PNode
end;

Cтруктура «очередь» (queue) представляет цепочку связанных узлов-записей типа TNode. Поле Next последнего элемента цепочки равно nil. Началом очереди («головой», head) считается первый элемент цепочки, концом («хвостом», tail) — ее последний элемент. Для возможности быстрого добавления в конец очереди нового элемента удобно хранить, помимо указателя на начало очереди, также и указатель на ее конец. В случае пустой очереди указатели на ее начало и конец полагаются равными nil. Значением элемента очереди считается значение поля Data.

Рассмотрим условие задачи Dynamic26, которое я слегка изменил.

Даны указатели P1 и P2 на начало и конец очереди (если очередь является пустой, то P1 = P2 = nil). Также дано число N (> 0) и набор из N чисел. Описать тип TQueue — запись с двумя полями типа PNode: Head (начало очереди) и Tail (конец очереди) — и процедуру Enqueue(Q, D), которая добавляет в начало очереди Q новый элемент со значением D (Q имеет тип TQueue им передается в процедуру по адресу, D — входной параметр целого типа). С помощью процедуры Enqueue добавить в исходную очередь данный набор чисел и вывести новые адреса ее начала и конца.

Решение
 
Рисунок 1 поясняет условие задачи. Имеется односвязный список  Адрес первого элемента хранится в указателе P1, адрес последнего - в P2 (рис. 1, a). Второй, альтернативный, вариант представлен на рисунке 2, b. Здесь для хранения адресов первого и последнего элементов списка используются поля Head и Tail переменной-записи Q. Как видим, условие задачи обладает некоторой избыточностью, так как для решения достаточен лишь один из вариантов.

При решении нашей задачи мы указатели P1 и P2 применять не будем, ограничившись использованием записи Q.

В программе использованы следующие процедуры.
HexWriteByte - выводит на печать шестнадцатеричную цифру,
HexWriteWord - распечатывает адрес сегмента/смещения,
WritePointer - выводит на печать значение указателя,
EnQueue - добавляет в очередь элемент со значением D,
ShowQueue - выводит на печать содержимое списка,
DeleteQueue - удаляет список.
Program queue; { of pointer}
 uses crt;
 type PNode = ^TNode;
      TNode = record
        Data: integer;
        Next: PNode
     end;
      TQueue = record
        Head, Tail: PNode
     end;
 var Q    : TQueue;
     N,D,I: integer;
 procedure HexWriteByte(b:byte);{Listing of hexadecimal value}
  var left,right: integer;
  begin
   left:=b div 16;
   case left of
    0..9  : write(chr(left+48)); {48 -> ord('0')}
    10..15: write(chr(left+55)) end; {55 -> ord('7')}
   right:=b mod 16;
      case right of
    0..9  : write(chr(right+48));
    10..15: write(chr(right+55)) end;
   end;
 procedure HexWriteWord(w:word);
  begin
   write('$');
   HexWriteByte(hi(w));  {hi(w) - hi byte of w}
   HexWriteByte(lo(w));  {lo(w) - low byte of w}
  end;
 procedure WritePointer(X:PNode); {Listing of value of the pointer}
  begin
   HexWriteWord(seg(X^));
   write(':');
   HexWriteWord(ofs(X^));
   writeln;
  end;
 procedure EnQueue(var Q:TQueue; D:integer);
  var Add_El:PNode;
  begin
    new(Add_El);
    Add_El^.Data:=D;
    Add_El^.Next:=Q.Head;
    Q.Head:=Add_El;
    if Q.Tail=nil then Q.Tail:=Add_El;
  end;
 procedure ShowQueue(Q:TQueue);
  var Current:PNode;
  begin
   clrscr;
   if Q.Head<>nil then
   begin
   writeln('Content of list:');
   Current:=Q.Head;
   while Current<>nil do
    begin
      writeln(Current^.Data:20);
      Current:=Current^.Next
    end
   end
   else
    begin
       clrscr;
       writeln('The list is empty!');
    end;
   readkey
  end;
procedure DeleteQueue(var Q:TQueue);
  var Del_El:PNode;
  begin
    Del_El:=Q.Head;
    if Del_El<>nil then
     begin
      while Del_El<>nil do
       begin
        Q.Head:=Del_El^.Next;
        dispose(Del_El);
        Del_El:=Q.Head;
       end;
      clrscr;
      writeln('The list is removed!');
      Q.Tail:=nil;
     end
      else
      begin
       clrscr;
       writeln('The list is empty!');
      end;
   readkey
  end;
  begin
   clrscr;
   writeln('Enter amount of elements');
   read(N);
   Q.Head:=nil;
   Q.Tail:=nil;
   randomize;
   for I:=1 to N do EnQueue(Q,random(20));
   ShowQueue(Q);
   repeat
    clrscr;
    writeln('Enter position number:');
    writeln('1 - Write pointer');
    writeln('2 - Show queue');
    writeln('3 - Delete queue');
    writeln('4 - Exit');
    read(I);
    case I of
     1: begin
        Write('The address first element: ');
        WritePointer(Q.Head);
        Write('The address of last element: ');
        WritePointer(Q.Tail);
        readkey;
        end;
     2: ShowQueue(Q);
     3: DeleteQueue(Q)
    end
   until I=4
  end.
Сайт создан в системе uCoz