Pointer71. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы двусвязного списка (о списке с барьерным элементом см. задание Pointer70). Разбить список на два, перенеся во второй список все элементы от текущего до последнего и добавив ко второму списку барьерный элемент. Если текущий элемент исходного списка является барьерным элементом, то второй список должен быть пустым (то есть состоять только из барьерного элемента). Вывести указатель на барьерный элемент второго списка. Операцию выделения памяти использовать только для создания барьерного элемента второго списка.
Решение:
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 |
program Pointer71; type PNode=^TNode; TNode=record Data: Integer; Next: PNode; Prev: PNode; end; function CycleList():PNode; var P1,pt1,pt2,temp: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); pt1.Prev:=pt2; pt2.Next:=pt1; pt2:=pt2.Next; end; pt2.Next:=nil; new(temp); temp.Data:=0; temp.Next:=P1; temp.Prev:=Pt2; P1.Prev:=temp; Pt2.Next:=temp; CycleList:=temp; end; Procedure SplitCycleList(var PB,PC:PNode); var P1,P2:PNode; begin New(P1); P1.Data:=0; if PB=PC then PC:=PC.Next; P1.Prev:=PB.Prev; P1.Next:=PC; P2:=PB; P2.Prev:=Pc.Prev; P1.Next.Prev:=P1; P1.Prev.Next:=P1; P2.Prev.Next:=P2; PB:=P1; PC:=P2; end; var P1,P2:PNode; a:^Word; begin P1:=CycleList(); P2:=P1.Next.Next; SplitCycleList(P1,P2); a:=Addr(P2); Writeln('2L PB: ',a^); end. |
Другие задачи из раздела Pointer можно посмотреть здесь.
Комментарии: