Sunteți pe pagina 1din 14

Aplicatie la liste inlantuite

Reprezentarea polinoamelor si operatii cu polinoame

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

Q( X ) = 100 X 2010 + X 1000 + X 2 + 5


Q: 100 1 1 2010 1000 2 0 0 0 2009 999 1 ... 0 0 5 2008 3 0 ...

Reprezentarea polinoamelor
Fiecare

termen nenul se va reprezenta ca un nod cu componentele:


Coef Grad Link (legatura la urmatorul termen nenul)

Numai termenii Termenii se vor

nuli vor fi reprezentati. aseza in lista in ordinea crescatoare a gradelor.


coef grad link

P( X ) = 3 X 2 + 2 X + 1
P:

Reprezentarea polinoamelor
3 2 2 1 1 0 NULL

Q( X ) = 100 X 2010 + X 1000 + X 2 + 5


Q: 5 0 1 2 1 1000 100 2010 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

ai + bi daca 0 i min( m, n) ci = ai daca n > m si m < i n b daca m > n si n < i m i

Algoritmul de adunare P, Q date => P = P + Q


Plecand

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

Algoritmul de adunare Variabile


Folosim

variabilele: - HEADP pointer la lista lui P - HEADQ pointer la lista lui Q

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

Algoritmul de adunareultima parte


preced ->link =temp temp ->link = NULL temp ->coef = iterQ -> coef temp ->grad = iterQ -> grad // avanseaz in lista lui Q iterQ= iterQ->link

preced= temp endwhile

S-ar putea să vă placă și