♥注:未經博主同意,不得轉載。
多項式的表示與求和是線性表應用的典型案列。
在數學上,一元多項式P(x)的表示為:
P(x)=a0+a1x+a2x2+…+anxn
其中,n為大於或等於0的整數,表示x的冪:ao,a1,…an為系數,an≠0,a0,a1,…,an-1可以為0,也可以不為0。
一元多項式的表示
為了表示一元多項式,可以將其所有項的系數用一個線性表來表示:(a0,a1,…,an)。這個線性表可以使用順序存儲結構或鏈式存儲結構來存儲,從而進行多項式的有關運算。若采用順序存儲結構,可使用一個一維數組存儲這個線性表,即多項式的系數,而相應的冪則使用數組下標來表示。
一元多項式的順序存儲結構如下:
1 typedef int DataType; 2 const int MaxPolySize=100; 3 4 class Polyn 5 { 6 private: 7 DateType data[MaxPolySize]; 8 int size; //元素的個數 9 10 public: 11 Polyn(){size = 0;} //構造一個空多項式 12 ~Polyn(); 13 14 void Clear(){size=0;} //清空 15 Polyn sum(Polyn a); //多項式相加 16 Polyn sub(Polyn a); //多項式相減 17 };
但多項式的順序存儲有一個缺點:當存儲形如P(x)=1+10x99的多項式時,由於a1到a98均為0,所以用來存儲一元多項式的一維數組中的絕大部分單元存儲的值都是0,導致存儲效率低下,造成存儲空間的浪費。因此,一般采用鏈式存儲結構來描述一元多項式。
一元多項式的鏈式存儲必須顯式地表達系數值和冪值,這是由於鏈式存儲打破了順序存儲中原有的冪與數組下標間的一一對應關系,一元多項式的項的結點結構表示如圖所示。
一元多項式的鏈式存儲結構表示如下:
1 2 struct term 3 { 4 double coef; //系數 5 int expn; //指數 6 }; 7 struct PNode 8 { 9 term data; 10 PNode *next; 11 }; 12 class Ployn 13 { 14 PNode *phead; 15 public: 16 Polyn() 17 { //構造函數 18 phead =new PNoed; 19 if(phead= =NULL) 20 exit(0); 21 phead->next=NULL; 22 } 23 ~Polyn(); //析構函數 24 25 void PolynAdd(Ployn Pa,Ployn Pb); //兩個多項式相加 26 void Print(); //打印多項式 27 void Create(); //建立多項式 28 }; 29
一元多項式的求和
本節以多項式的加法為例,講述一元多項式操作的實現。假設有一元n次多項式Pn(x)和一元m次多項式Qm(x),它們的系數可分別用線性表P=(p0,p1,…,pn)和Q=(q0,q1,…,qm)來表示。不失一般性,設m<n,則兩個多項式相加的結果Rn(x)=Pn(x)+Qm(x)可以表示為線性表R=(p0+q0,p1+q1,p2+q2,…,pm+qm,pm+1,…,pn)。由於做加法的一元多項式的項的冪值可能變化很大,如1+2x500+4x5000,因此,我們采用鏈式存儲結構來存儲一元多項式。
根據給出的一元多項式的鏈式存儲結構定義,給出一元多項式的加法的算法如下:
1 void Polyn::PolynAdd(Polyn Pa,Polyn Pb) 2 { 3 PNode *t1,*t2,*t3; 4 t1=Pa.phead->next; //t1指向Pa 5 t2=Pb.phead->next; //t2指向Pb 6 t3=phead; 7 8 while(t1&&t2) 9 { 10 if(t1->data.expn<t2->data.expn) //t1所指數據小於t2所指數據 11 { 12 t3->next=new PNode; 13 t3=t3->next; 14 t3->data=t1->data; 15 t1=t1->next; 16 }//t1插入到t3中 17 else if(t1->data.expn>t2->data.expn) 18 { t3->next=new PNode; 19 t3=t3->next; 20 t3->data=t2->data; 21 t2=t2->next; 22 }//將t2插入到t3中 23 else 24 { 25 double a=t1->data.coef+t2->data.coef; //指數相等 26 if(a) 27 { 28 t3->next=new PNode; 29 t3=t3->next; 30 t3->data.coef=a; 31 t3->data.expn=t1->data.expn; 32 } 33 t1=t1->next;//t1往后移 34 t2=t2->next;//t2往后移 35 } 36 } 37 38 while(t1!=NULL)//將t1剩余結點復制到t3中 39 { 40 t3->next=new PNode; 41 t3=t3->next; 42 t3->data=t1->data; 43 t1=t1->next; 44 } 45 while(t2!=NULL)//將t2剩余結點復制到t3中 46 { 47 t3->next=new PNode; 48 t3=t3->next; 49 t3->data=t2->data; 50 t2=t2->next; 51 } 52 t3->next=NULL; 53 } 54 55 //建立多項式 56 void Polyn::Create() 57 { 58 PNode *p,*q; 59 int n; 60 q=phead; 61 cout<<"請輸入多項式的項數:"<<endl; 62 cin>>n; 63 if(n>0) 64 { 65 cout<<"請輸入多項式各項的系數和指數:"<<endl; 66 for(int i = 0;i < n; ++i) 67 { 68 p=new PNode; 69 cin>>p->data.coef>>p->data.expn; 70 p->next=NULL; 71 q->next=p; 72 q=p; 73 } 74 } 75 } 76 77 //輸出多項式 78 void Polyn::Print() 79 { PNode *p; 80 p=phead->next; 81 cout<<endl; 82 while(p) 83 { 84 cout<<p->data.coef<<" "<<p->data.expn<<endl; 85 p=p->next; 86 } 87 cout<<endl; 88 } 89 //析構函數:釋放鏈表 90 Polyn::~Polyn() 91 { //析構函數 92 PNode *p,*q; 93 p=phead->next; //p指向第一個數據結點 94 while(p) 95 { 96 q=p; 97 p=p->next; //p指向下一個數據結點 98 delete q; //釋放q所指的數據結點 99 } 100 phead->next=NULL; //頭結點也釋放 101 }
測試函數則放在main函數里:
1 int main() 2 { 3 Polyn Pa,Pb,Pc; //定義三個多項式 4 Pa.Create(); //建立多項式Pa 5 Pb.Create(); //建立多項式Pb 6 Pc.PolynAdd(Pa,Pb); //Pa與Pb相加得到Pc 7 cout<<endl<<"多項式相加得"; 8 Pc.Print(); //打印Pc 9 10 return 0; 11 }
測試情況如下: