Pointer61. Дан непустой двусвязный список, первый, последний и текущий элементы которого имеют адреса $$P_1$$, $$P_2$$ и $$P_3$$. Также даны пять чисел. Используя тип TList (см. задание Pointer59), описать процедуру InsertBefore($$L$$, $$D$$), которая вставляет новый элемент со значением $$D$$ перед текущим элементом списка $$L$$ ($$L$$ — входной и выходной параметр типа TList, $$D$$ — входной параметр целого типа). Вставленный элемент становится текущим. С помощью этой процедуры вставить пять данных чисел в исходный список и вывести новые адреса его первого, последнего и текущего элементов.
Решение:
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 |
program Pointer61; type PNode=^TNode; TNode=record Data: Integer; Next: PNode; Prev: PNode; end; TList=record First,Last,Current:PNode; end; procedure InsertBefore(var L:TList;D:integer); var temp:PNode; begin new(temp); temp.Data:=D; temp.Next:=L.Current; if L.Current<>nil then if L.Current.Prev<>nil then begin temp.Prev:=L.Current.Prev; L.Current.Prev:=Temp; temp:=temp.Prev; Temp.Next:=L.Current.Prev; L.Current:=L.Current.Prev; end else begin L.First:=temp; L.First.Prev:=nil; L.First.Next:=L.Current; L.Current.Prev:=L.First; L.Current:=L.Current.Prev; end else begin temp.Prev:=nil; L.First:=temp; L.Last:=temp; L.Current:=temp; end; end; var P1,P2,P3:PNode; L:TList; a:^Word; N,D,i:integer; begin P1:=nil; P2:=nil; P3:=nil; L.First:=P1; L.Last:=P2; L.Current:=P3; Write('N: '); Readln(N); for i:=1 to N do begin Write('D: '); Readln(D); InsertBefore(L,D); end; a:=Addr(L.First); Writeln('First: ',a^); a:=Addr(L.Last); Writeln('Last: ',a^); a:=Addr(L.Current); Writeln('Current: ',a^); end. |
Другие задачи из раздела Pointer можно посмотреть здесь.
Комментарии: