Pointer23. Даны две непустые очереди; адреса начала и конца первой равны $$P_1$$ и $$P_2$$, а второй — $$P_3$$ и $$P_4$$. Перемещать элементы из начала первой очереди в конец второй, пока значение начального элемента первой очереди не станет четным (если первая очередь не содержит четных элементов, то переместить из первой очереди во вторую все элементы). Вывести новые адреса начала и конца первой, а затем второй очереди (для пустой очереди дважды вывести $$nil$$). Операции выделения и освобождения памяти не использовать.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
program Pointer23; type PNode=^TNode; TNode=record Data: Integer; Next: PNode; // Prev: PNode; end; procedure CreateQueue(var P1,P2:PNode); var pt1,pt2:PNode; i,N:integer; begin Write('NumEl:'); Readln(N); new(p1); Write('num: '); Readln(P1^.Data); pt2:=p1; for i:=1 to N-1 do begin new(pt1); Write('num: '); Readln(pt1^.Data); pt2.Next:=pt1; pt2:=pt2.Next; end; pt2.Next:=nil; p2:=pt2; end; procedure Move2(var P1,P2,P3,P4:PNode); var temp :PNode; begin if P1<>nil then begin P4^.Next:=P1; While(odd(P1.Data) and (P1<>P2)) do begin temp:=P1; P1:=P1^.Next; end; if not(odd(P1.Data)) then P1:=temp; P4:=P1; if p1<>p2 then P1:=P1^.Next else begin P1:=nil; P2:=nil; end; P4^.Next:=nil; end; end; var P1,P2,P3,P4:PNode; a:^Word; begin CreateQueue(P1,P2); CreateQueue(P3,P4); Move2(P1,P2,P3,P4); if p1=nil then Writeln('P1: nil') else begin a:=Addr(P1); Writeln('P1: ',a^); end; if p2=nil then Writeln('P2: nil') else begin a:=Addr(P2); Writeln('P2: ',a^); end; if p3=nil then Writeln('P3: nil') else begin a:=Addr(P3); Writeln('P3: ',a^); end; if p4=nil then Writeln('P4: nil') else begin a:=Addr(P4); Writeln('P4: ',a^); end; end. |
Другие задачи из раздела Pointer можно посмотреть здесь.
Подключил модуль MyQueue. В модуле описаны типы PNode, TNode, TQueue и подпрограммы: NewNode(data: integer; next: PNode): PNode; Enqueue(var Q: TQueue; data: integer); EnqueueNode(var Q: TQueue; p: PNode); DequeueNode(var Q: TQueue): PNode; (см. задачу Pointer22)