Тема. Динамические структуры данных. Списки.
С клавиатуры вводится последовательность вещественных чисел x1, x2, x3... xn n>2. Вычислить x1*xn; x2*xn-1; x3*xn-2 ... xn*x1.
Указание. Использовать двусвязный список.
Исходный код программы для Delphi:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PElement = ^ TElement;
TElement = record
next:PElement;
back:PElement;
value:double;
end;
function next_elem(pelem:PElement):PElement;
begin
if (pelem <> nil) then
result := pelem^.next
else
result := nil;
end;
function back_elem(pelem:PElement):PElement;
begin
if (pelem <> nil) then
result := pelem^.back
else
result := nil;
end;
function IsGood(pElem1,pElem2:PElement):Boolean;
begin
if (pElem2 = nil)or(pElem1 = nil) then
result:=false
else
result:= ((cardinal(@pElem1^.next) - cardinal(@pElem2^.back)) and $80000000 ) >= sizeof(TElement);
end;
var
N,Count:Integer;
Element:TElement;
next,back,p:PElement;
s:Double;
i:Integer;
begin
FillChar(Element,sizeof(Element),0);
next := @Element;
Write ('write N: ');
Readln(N);
Count :=N;
// создаем список, и вводим данные
for N:=N downto 1 do
begin
next^.next := PElement(GetMemory(sizeof(TElement)));
back:=next;
next:=next^.next;
back^.next:=next;
next^.back:=back;
next^.next:=nil;
write('X',N,' :');
readln(next^.value);
end;
// определяем посл. елемент в листе
back := next;
while next <> nil do
begin
back:=next;
next:=next^.next;
end;
next := Element.next;
i:=1;
while IsGood(next,back) do
begin
s:= back^.value * next^.value;
writeln('x',i,'*','x',Count-i+1,'=',s:5:7);
i:=i+1;
next:= next_elem(next);
back:= back_elem(back);
end;
s:= back^.value * next^.value;
writeln('x',i,'*','x',Count-i+1,'=',s:5:7);
next := Element.next;
while next <> nil do
begin
p:= next^.next;
FreeMem(next);
next:=p;
end;
readln;
end.
Блок схемы:
|