第二章:5.線性表應用---一元多項式的表示及相加


前言:

  學習了線性表的 順序結構 和鏈式結構,那么這種學習有什么用?

  本節將會學習如何用線性表來實現 一元多項式的表示及相加。

 

目錄:

1.一元多項式

正文:

  一元多項式:

    數學上,一個一元多項式可寫成 按冪升序排列的形式:

     Pn(x)= P0 + P1x1 + P2x2 + .... + Pnxn

    它由 n+1 個系數唯一確定,因此在計算機里可以用線性表 P 來表示:

    P= (P0,P1, P2 , ....  Pn);

    其中每一項的指數 隱藏在Pi 的序號中

 

  一元多項式的相加(采用 順序存儲結構):

    設m<n ,兩個多項式相加的結果為:Rn(x) = Pn(x) + Qm(x)

    此運算可以用相性表R 來表示:

    R= (P0 + Q0,P1+ Q1, P2 + Q2, .... + Pm+ Qm,Pm+1  ,.... Pn);

    如果你已經掌握了 線性表的順序存儲,那么你會發現,顯然R P Q 采用順序存儲結構,使得多項式的相加算法 十分簡單清晰,很容易實現。

 

  一元多項式的表示相加(采用 鏈式存儲結構):

    依然采用順序結構來表示 一元多項式,那么對於如下多項式:

      S(x)= 1 + 3x1000 + 2x20000

    順序存儲結構會開辟 20001 個長度的存儲空間,但是此多項式只有3項,於是造成了對內存空間的極大浪費。

 

    改進:使用鏈式存儲結構來表示 一元多項式,由於鏈式存儲 數據元素在物理位置上不是相鄰的,此時無法通過位序來確定 多項式中系數對應的指數,那么此時 鏈表只存儲一元多項式的非零項,每個結點存儲兩個數據域:(項:pi  ,指數:ei) 一個指針域:next。

    這種形式下,最壞的存儲情況是 多項式沒有非零項,即 n+1 個項數,耗費存儲空間為 采用順序結構耗費存儲空間 的2倍,但是對比 S(X)類型多項式的存在,一元多項式采用鏈表的形式將大大節省存儲空間。

    存儲結構圖示:

    

    用C語言表示的存儲結構:

      typedef struct Polynomial{
            float coef;                      //系數
            int   expn;                      //指數
            struct LNode *next;            //結點的指針域
      }Polynomial,*LinkList;

 

    代碼實現:

#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status是函數的類型,其值是函數結果狀態碼
typedef int Status;

typedef struct Polynomial{
    float coef;                    //系數
    int   expn;                    //指數
    struct Polynomial *next;            //結點的指針域
}Polynomial,*LinkList;

//創建具有m個項的一元多形式
Status CreatPolyn(LinkList &L,int m){
    Polynomial * q=L;                            //q指向頭結點(最后一個結點)

    float coef;                    
    int   expn;
    for(int i=0;i<m;i++){
        printf("%s","請輸入系數:");
        scanf("%f",&coef);
        printf("%s","請輸入指數:");
        scanf("%d",&expn);

        Polynomial * Polyn=(LinkList)malloc(sizeof(Polynomial));
        if(!Polyn)    return ERROR;
        Polyn->coef=coef;
        Polyn->expn=expn;

        q->next=Polyn;                            //追加結點
        q=Polyn;                                //指向最后一個結點
    }
    q->next=NULL;
    return OK;
}

//多項式Pa 和 Pb相加,將結果保存在Pa 鏈中。
void AddPolyn(LinkList &La,LinkList &Lb){
    Polynomial * qa=La;
    Polynomial * qb=Lb;
    while(qa->next&&qb->next){
        //1.如果當前 qa 的指數 大於 qb 的指數。那么把 qb 所指結點插入到qa 所指結點之后,
        if((qa->next->expn)>(qb->next->expn)){                        
            Polynomial * temp=qb->next;
            qb->next=qb->next->next;                        //從 qb 中刪除當前結點

            temp->next=qa->next;                            //在 qa 當前元素前 插入 qb中刪除的結點
            qa->next=temp;
        }
        
        //2.如果當前 qa 的指數 小於 qb 的指數。那么只需后移 qa指針即可。
        if((qa->next->expn)<(qb->next->expn)){
            qa=qa->next;
        }

        //3.如果當前 qa 的指數 等於 qb 的指數。那么讓對應系數相加。
        if((qa->next->expn)==(qb->next->expn)){
            float temp=(qa->next->coef)+(qb->next->coef);
            
            //分別從qa 中刪除當前結點
            if(temp==0){
                qa->next=qa->next->next;
            }
            
            //修改qa當前結點 的系數,后移指針。
            if(temp!=0){
                qa->next->coef=temp;
                qa=qa->next;
            }

            qb=qb->next;
        }
    }

}

void PrintAllValues(LinkList &L){
    Polynomial * q=L;                        //q指向頭結點
    while(q->next){
        printf("系數:%f",q->next->coef);
        printf("指數:%d\n",q->next->expn);
        q=q->next;
    }
}

void main(){
    Polynomial * Pa=(LinkList)malloc(sizeof(Polynomial));
    Pa->next=NULL;
    printf("%s\n","Pa:");
    CreatPolyn(Pa,4);
    PrintAllValues(Pa);

    Polynomial * Pb=(LinkList)malloc(sizeof(Polynomial));
    Pb->next=NULL;
    printf("\n%s\n","Pb:");
    CreatPolyn(Pb,3);
    PrintAllValues(Pb);

    AddPolyn(Pa,Pb);
    printf("\n%s\n","Pa+Pb:");
    PrintAllValues(Pa);
}    

    運行結果:

      

    


免責聲明!

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



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