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