You are on page 1of 7

X l a thc bng danh sch lin kt

Danh sch lin kt, Gii thut & lp trnh Add comments
Thng 6

282011

Khai bo danh sch lin kt n lu tr mt a thc. Vit cc hm : Nhp a thc vo danh sch lin kt. In a thc. Cng hai a thc. Nhn hai a thc. Tnh gi tr ca mt a thc vi X cho trc.

Khai bo cc struct cn thit: Mi a thc gm nhiu n thc, mi n thc l mt s hng c dng aX^b, nh vy mi n thc cn 2 thnh phn: h s v s m.
struct Donthuc { float heso; int somu; };

struct Node { Donthuc Info; Node *pNext; };

struct Dathuc { Node *pHead; };

void ListInit(Dathuc &tmp) { tmp.pHead=0; }

nhp a thc vo danh sch lin kt trc ht ta cn khai bo hm thm mt n thc vo danh sch lin kt, n thc thm vo s m bo th t ly tha gim dn v khng trng bc ly tha, nh vy cn xt trong danh sch lin kt nu c n thc cng bc ly tha th s cng h s vo n thc , nu cha c th n thc mi s c thm vo trc n thc c bc ly tha nh hn n.

void Add(Dathuc &L, Donthuc t) { Node *tmp = new Node; tmp->Info = t; //Nu danh sch rng hoc s m u danh sch nh hn s m n thc th s thm vo u danh sch if (L.pHead == NULL || L.pHead->Info.somu < t.somu) { tmp->pNext=L.pHead; L.pHead=tmp; } else { Node *cur=L.pHead; //Tm v tr m n thc ng sau n c s m nh hn s m n thc cn thm while (cur->pNext && cur->pNext->Info.somu >= t.somu) { cur=cur->pNext; } //Nu v tr tm c c s m bng vi s m n thc cn thm th ch cn cng h s vo n thc ti if (cur->Info.somu == t.somu) cur->Info.heso += t.heso; else { //Thm vo sau v tr tm c tmp->pNext = cur->pNext; cur->pNext=tmp; }

} }

Nhp a thc: ta ln lt nhp h s v s m cho n khi nhp xong ly tha bc 0 th kt thc nhp.

void NhapDathuc(List &tmp) { Donthuc t; do { cout<<endl<<"He so: "; cin>>t.heso; cout<<"So mu: "; cin>>t.somu; Add(tmp,t); } while (t.somu>0); }

In a thc ra mn hnh (xut a thc), v a thc nhp vo m bo th t gim dn bc ly tha nn ta ch cn duyt ht danh sch v in ra tng n thc theo dng aX^b, biu thc in ra c p hn th cn kim tra mt s chi tit sau: Nu h s bng 0 th b qua, nu h s nh hn khng th khng in du + gia cc n thc, nu s m bng 0 th ch in h s.
void XuatDathuc(List L) { Node *cur=L.pHead; if (cur) { cout<<cur->Info.heso<<"X^"<<cur->Info.somu; cur=cur->pNext; } while (cur) { if (cur->Info.heso)

{ if (cur->Info.heso>0) cout<<"+"; cout<<cur->Info.heso; if (cur->Info.somu) cout<<"X^"<<cur->Info.somu; } cur=cur->pNext; } }

Cng 2 a thc, vi hm thm mt n thc vo a thc trn th vic cng 2 a thc ht sc d dng, ch vic to mt a thc mi ri duyt qua 2 a thc v thm tng n thc vo a thc mi.

Dathuc Cong2Dathuc(Dathuc a, Dathuc b) { Dathuc tmp; DathucInit(tmp);

Node *cur = a.pHead; while (cur) { Add(tmp,cur->Info); cur=cur->pNext; }

cur = b.pHead; while (cur) { Add(tmp,cur->Info); cur=cur->pNext; } return tmp; }

Nhn 2 a thc th ly tng n thc ca a thc ny nhn vi tng n thc ca a thc kia ri thm vo mt a thc mi.

Dathuc Nhan2Dathuc(Dathuc a, Dathuc b) { Dathuc tmp; DathucInit(tmp); Node *cur_a=a.pHead; Node *cur_b; Donthuc t;

while (cur_a) { cur_b=b.pHead; while (cur_b) { t.heso = cur_a->Info.heso * cur_b->Info.heso; t.somu = cur_a->Info.somu + cur_b->Info.somu; Add(tmp,t);

cur_b=cur_b->pNext; } cur_a=cur_a->pNext; }

return tmp; }

Cn mt hm rt gn a thc xa i cc n thc c h s bng 0 trong a thc.

void Rutgon(Dathuc &tmp) { Node *cur; while (tmp.pHead && tmp.pHead->Info.heso==0)

{ cur=tmp.pHead; tmp.pHead = tmp.pHead->pNext; delete cur; }

if (tmp.pHead) { cur=tmp.pHead; while (cur->pNext) { if (cur->pNext->Info.heso == 0) { Node *del = cur->pNext; cur->pNext = del->pNext; delete del; } else cur=cur->pNext; } }

Tnh gi tr a thc.

float TinhGiatri(float X, Dathuc L) { float Ret=0; Node *cur=L.pHead; while (cur) { Ret += cur->Info.heso * pow(X,cur->Info.somu);

cur=cur->pNext; } return Ret; }

V d s dng cc hm trn.

void main() { Dathuc A,B,C,D; DathucInit(A); DathucInit(B); DathucInit(C); float X; cout<<"Nhap da thuc thu nhat: "<<endl; NhapDathuc(A); cout<<"Da thuc thu nhat: "<<endl; XuatDathuc(A);

You might also like