Имеется описание двух типов (типизированного указателя PNode и записи TNode):
type
PNode = ^TNode;
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 добавить в исходную очередь данный набор чисел и вывести новые адреса ее начала и конца. |
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. |