線性表——一元多項式的求和


♥注:未經博主同意,不得轉載。

多項式的表示與求和是線性表應用的典型案列。

在數學上,一元多項式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 }

測試情況如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM