Documente Academic
Documente Profesional
Documente Cultură
Reprezentarea polinoamelor
P( X ) = 3 X + 2 X + 1
2
Q( X ) = 100 X
2010
+X
1000
+ X +5
2
Cum sa le reprezentam daca de exemplu dorim sa scriem un program care aduna doua polinoame?
P( X ) = 3 X 2
polinom se poate scrie ca o suma de termeni. Fiecare termen este bine definit prin coeficient si gradul + 2X +1 termenului
P: 3 2 2 1 1 0
Fiecare
Reprezentarea polinoamelor
Reprezentarea polinoamelor
Fiecare
P( X ) = 3 X 2 + 2 X + 1
P:
Reprezentarea polinoamelor
3 2 2 1 1 0 NULL
Adunarea polinoamelor
P( X ) = X + X X 2 3 4 5 Q( X ) = 8 + 2 X + X + X + X
3 5
( P + Q)( X ) = 8 + X + 2 X + 2 X + X
2 3
Adunarea polinoamelor
P ( X ) = a0 + a1 X + a2 X 2 + ... + an X n
Q( X ) = b0 + b1 X + b2 X + ... + bm X
2 m
an 0 bm 0
p
( P + Q)( X ) = c0 + c1 X + ... + c p X
de la lista polinomului P, daca va fi necesar, - vom adauga in lista noduri, - vom sterge noduri si - vom modifica coeficienti, astfel incat lista polinomului P va deveni lista polinomului P+Q. In final, lista polinomului Q va
i
Folosim
variabilele suplimentare: - iterP i iterQ, pointeri ce parcurg listele celor doua polinoame - preced puncteaza la nodul
Algoritmul de adunareDescriere
// Initializare iterQ = HEADQ, iterP = HEADP, preced=NULL while (iterQ NULL and iterP NULL) // Atat timp cat nici una din liste nu s-a epuizat i = iterP -> grad, j = iterQ -> grad a= iterP -> coef, b= iterQ -> coef if i = j then // termeni de acelasi grad if a+b 0 then // coeficientul sumei termenilor este nenul iterP -> coef = a + b // avanseaz in lista lui P preced= iterP
P link
else // sterge din lista lui //termenul curent preced ->link = iterP -> temp = iterP iterP= iterP -> link delete temp. endif iterQ=iterQ->link //avanseaz in lista else if j < i then //insereaza un nou nod in lista P inaintea nodului curent in P ca o copie a nodului curent n Q. Aloca memorie pentru un nod
nou.
if temp = NULL then OVERFLOW STOP endif if preced NULL then preced ->link =temp else // se insereaza la inceputul listei lui P HEADP=temp endif preced = temp temp ->link = iterP temp ->coef = b temp ->grad =j
else // avanseaz in lista lui P preced= iterP iterP = iterP ->link endif endif Endwhile // Daca lista lui Q nu s-a terminat, dar a lui P s-a terminat se adauga la lista lui P ceea ce a mai ramas din lista lui Q while (iterQ NULL ) Aloca memorie pentru un nod nou. temp = pointer la noul nod. if temp = NULL then OVERLOW; STOP endif