Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Двунаправленный линейный список


Автор: bip 6.5.2007, 11:49
Код


unit unit2;

interface
{---}
procedure InitL2;
procedure WriteL2;
procedure InsertL2(P:PZveno2; z1,z2:intger);
procedure DeleteL2(D:Pzveno2;var z1,z2:values);
{--------------------------------------------------------------}
type
values=record
x,y:integer;
end;
{--------------------------------------------------------------}
type PZveno2=^TZveno2;
TZveno2=receord next,pred:PZveno:info:values;end;
varFirst, Last:PZveno;{ykazateli na pervoe i poslednee zveno}
{--------------------------------------------------------------}
implementation
{---}
procedure InitL2; begin First:=nil;Last:=nil;end;
{--------------------------------------------------------------}
procedure WriteL2;
var P:PZveno;
 begin
 P:=Last;
   while P<>nil do begin
     Write(P^.info.x);
     Write(P^.info.y);
     P:=P^.pred;
   end;
 end;
{---------------------------------------------------------------}
procedure InsertL2(P:PZveno2; z1,z2:intger);
var
N,S:PZveno2;
begin
 new(N); N^.info.x:=z1;N^.info.y:=z2;
 if P=nil then S:=First else S:=P^.next;
 N^.next:=S;
 if P=nil then First:=N else P^.next:=N;
 N^.pred:=P;
 if S=nil then Last:=N else S^.pred:=N;
end;
{-----------------------------------------------------------------}
procedure DeleteL2(D:Pzveno2;var z1,z2:values);
var
P,S:PZveno2;
begin
 P:=D^.pred; S:=D^.next;
 if P=nil then First:=S else P^.next:=S;
 if S=nil then Last:=P else S^.pred:=P;
 z1:=D^.info.x;
 z2:=D^.info.y;
 dispose(D);
end;
{------------------------------------------------------------------}
end.

вот модуль для работы с двунаправленным списком.
Вопрос: как выполнить следующие операции над полиномами:сложение, двух с получением третьего,умножение двух с получением третьего и дифференцирование,  инициализация многочлена по заданной строке, изоб-ей его алгеб-ую запись.
У кого какие мысли? smile 

Автор: XupyprMV 6.5.2007, 18:52
В списке храним коэффициенты перед соответствуюзими степениями х начиная с константы (1,x,x^2 и т. д.)

все эти операции реализуются аналогично длинной арифметике для чисел, за исключением того что длинную арифметику обычно на массивах пишут, а тебе нужно со списками...

Автор: bip 6.5.2007, 22:51
ок надо  по разбираться, примерчик бы smile 

Автор: XupyprMV 7.5.2007, 09:26
Пример длинной арифметики на массивах. Просьба сильно не пинать - код не тестил... но он компилится  smile 

Код

{$APPTYPE CONSOLE}
uses Math;

const MAXN=1000;
type polycoeff=record
      a:array[0..MAXN]of longint;
      len:longint;
     end;

function len(x:polycoeff):longint;
var i:longint;
begin
 i:=MAXN;
 while (i>=0)and(x.a[i]=0) do dec(i);
 len:=i;
end;

function add(x,y:polycoeff):polycoeff;
var i:longint;
    z:polycoeff;
begin
z.len:=max(x.len,y.len);
for i:=0 to z.len do
 begin
  z.a[i+1]:=(x.a[i]+y.a[i])div 10;
  z.a[i]:=z.a[i]+(x.a[i]+y.a[i]) mod 10;
 end;
 z.len:=len(z);
 add:=z;
end;

function mul(x,y:polycoeff):polycoeff;
var i,j:longint;
    z:polycoeff;
begin
for i:=0 to MAXN do z.a[i]:=0;
for i:=0 to x.len do
 for j:=0 to y.len do
 begin
  z.a[i+j]:=z.a[i+j]+x.a[i]*y.a[i];
 end;
 z.len:=len(z);
 mul:=z;
end;

function dif(x:polycoeff):polycoeff;
var i,j:longint;
    z:polycoeff;
begin
for i:=0 to MAXN do z.a[i]:=0;
for i:=1 to x.len do
 z.a[i-1]:=x.a[i]*i;
 z.len:=len(z);
 dif:=z;
end;

begin

end.

Автор: bip 7.5.2007, 14:29
 smile  . Я так понимаю надо бежать по двум спискам , по узлам и складывать если их степени одинаковы, да?

Автор: XupyprMV 8.5.2007, 09:45
Для суммы можно просто параллельно бежать...

Для умножения придётся повозится...

Дифференцирования ты уже понял - достаточно просто делается...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)