Pointer80. Даны указатели $$P_1$$ и $$P_2$$ на барьерный и текущий элементы непустого двусвязного списка, причем текущий элемент не совпадает с барьерным.Используя тип TListB (см. задание Pointer74), описать функцию LBDeleteCurrent($$L$$) целого типа, удаляющую из списка $$L$$ текущий элемент и возвращающую его значение ($$L$$ — входной и выходной параметр типа TListB). Текущим становится следующий элемент или, если следующий элемент является барьерным, предыдущий элемент списка. Функция также освобождает память, занимаемую удаленным элементом. Если текущим элементом является барьерный элемент, то функция не выполняет никаких действий и возвращает $$0$$. С помощью этой функции, а также функции IsBarrier из задания Pointer78, удалить из исходного списка пять элементов (или все элементы, если их менее пяти) и вывести их значения. Вывести также новый адрес текущего элемента списка.
Решение:
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 |
program Pointer80; type PNode=^TNode; TNode=record Data: Integer; Next: PNode; Prev: PNode; end; TListB=record Barrier,Current: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; function IsBarrier(L:TListB):boolean; begin if L.Current=L.Barrier then IsBarrier:=True else IsBarrier:=False; end; function LBDeleteCurrent(var L:TListB):integer; var temp:PNode; begin LBDeleteCurrent:=L.Current.Data; if not(IsBarrier(L)) then begin L.Current.Prev.Next:=L.Current.Next; L.Current.Next.Prev:=L.Current.Prev; temp:=L.Current; if L.Current.Next<>L.Barrier then L.Current:=L.Current.Next else L.Current:=L.Current.Prev; Dispose(temp); end; end; var P1,P2:PNode; a:^Word; L:TListB; i:integer; begin P1:=CycleList(); P2:=P1.Next.Next; L.Barrier:=P1; L.Current:=P2; For i:=1 to 5 do Writeln(LBDeleteCurrent(L)); a:=Addr(L.Current); Writeln('current: ',a^); end. |
Другие задачи из раздела Pointer можно посмотреть здесь.
Комментарии: