1. 程式人生 > >線性表--一元多項式相加

線性表--一元多項式相加

任務:本程式是一個控制檯程式,使用者可以根據自己的需求輸入兩個一元多項式,並且能夠實現顯示兩個多項式,再將這兩個多項式相加,輸出結果。

注意:本程式的輸入需求是按照指數的從小到大進行輸入,並且項數必須為正整數,指數需為整數,係數為雙精度型且不能為0。

具體程式碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define null 0
typedef struct PLNODE{
    float dbCoef;                //係數域
    int nExpn;                   //指數域
    struct PLNODE * next;        //指標域 
}*linklist,LNODE;               //PLNODE為一個新型別(是一個結構體),linkList為指向這樣的結構體的指標


 //建立一個空連結串列 
 linklist intlink(){
     linklist p;          //空連結串列 p 
     p=(PLNODE*)malloc(sizeof(PLNODE));
     p->next=NULL;    
     return p; 
 }

 //建立一個非空連結串列
 linklist creatlink(linklist p,float a[],int b[],int n){
    linklist r,s;               //非空連結串列 r,s 
    int i;
    r=p;
    for(i=0;i<n;i++){
        s=(PLNODE*)malloc(sizeof(PLNODE));
        s->dbCoef=a[i];     
        s->nExpn=b[i];
        r->next=s;
        r=s;       
    }
    r->next=NULL;
    return p;
  } 

  //連結串列長度
 int length(linklist p){
  int n=0;
 linklist q=p->next;  
 while(q!=    NULL){
     n++;
      q=q->next;
  }
  return n;
  } 
   //比較指數
   int compexpn(int expn1,int expn2){
    if(expn1>expn2)
       return -1;
       else if(expn1==expn2)
       return 0;
       else        
       return 1;    
    } 

    //兩個一元多項式相加
    linklist addPolyn(linklist ha,linklist hb,linklist hc){        
        linklist la,lb,lc,r;
        la=ha->next;
        lb=hb->next;    
        float sum;    
        lc=hc;
        while(la && lb){
            switch(compexpn(la->nExpn,lb->nExpn)){
                case -1:
                    r=(PLNODE*)malloc(sizeof(PLNODE));
                    r->dbCoef=la->dbCoef;
                    r->nExpn=la->nExpn;
                    lc->next=r;
                    lc=r;           
                    r->next=NULL;      //直到r的最後一個節點為空 
                    la=la->next;       
                    break;
                case 0:
                    sum=la->dbCoef+lb->dbCoef;        
                    if(sum!=0){
                        r=(PLNODE*)malloc(sizeof(PLNODE));
                        r->dbCoef=sum;
                        r->nExpn=la->nExpn;
                        lc->next=r;
                        lc=r;
                        r->next=null;    
                        la=la->next;
                        lb=lb->next;                    
                    }
                    else{
                        la=la->next;
                        lb=lb->next;
                    }
                    break;
                case 1:
                    r=(PLNODE*)malloc(sizeof(PLNODE));
                    r->dbCoef=lb->dbCoef;
                    r->nExpn=lb->nExpn;
                    lc->next=r;
                    lc=r;
                    r->next=null;
                    lb=lb->next;
                    break;    
            }
        }
        if(la){
            r=(PLNODE*)malloc(sizeof(PLNODE));
            r->dbCoef=la->dbCoef;
            r->nExpn=la->nExpn;
            lc->next=r;
            lc=r;
            r->next=null;
            la=la->next;
        
        }
        if(lb){
            r=(PLNODE*)malloc(sizeof(PLNODE));
            r->dbCoef=lb->dbCoef;
            r->nExpn=lb->nExpn;
            lc->next=r;
            lc=r;
            r->next=null;
            lb=lb->next;            
        }
        return lc;
    }

    //打印出一元多項式 
    void display(linklist ha) {
       if(ha==NULL)
    printf("F(x)=0");
    
    else{
      int n=length(ha)-1;
         ha=ha->next;
         printf("F(x)=");
         while(ha!=NULL){          
           printf("%.0fX^%d",ha->dbCoef,ha->nExpn);
                ha=ha->next;
           if(n!=0 && ha->dbCoef>0){
                   printf("+");
           }                           
                n--;
           }
         }
           printf("\n");
  }     

     int main(){
         int len1,len2;
         float m,a1[100],b1[100];     //a1裡面放第一項各項係數    b1放第二項各項係數 
         int n,a2[100],b2[100];         //a2  b2  放指數 
         linklist A,B,C;
        
         A=intlink();
        B=intlink();
         C=intlink();
        
         printf("請輸入第一個多項式的項數:\n");
         scanf("%d",&len1);
         
        for(int i=0;i<len1;i++){
            printf("請輸入第%d項係數:\n",i+1);
            scanf("%f",&m);
            a1[i]=m;                    //把輸入第一項的各項係數放入陣列a1中 
            printf("請輸入第%d項指數:\n",i+1);
            scanf("%d",&n);            //把輸入第一項的各項指數放入陣列a2中 
            a2[i]=n;            
        }
        
         printf("請輸入第二個多項式的項數:\n");
         scanf("%d",&len2);
         
        for(int j=0;j<len2;j++){
            printf("請輸入第%d項係數:\n",j+1);
            scanf("%f",&m);
            b1[j]=m;
            printf("請輸入第%d項指數:\n",j+1);
            scanf("%d",&n);
            b2[j]=n;
        }
         
         creatlink(A,a1,a2,len1);
         creatlink(B,b1,b2,len2);
         printf("\n");
         printf("第一個多項式為:\n");         
         display(A);    
        printf("\n");    
         printf("第二個多項式為:\n");         
         display(B);     
        addPolyn(A,B,C);
        printf("\n"); 
         printf("兩個多項式相加為:\n");        
         display(C);
         return 0;
     }

 

總結:程式碼有點冗長,但是真正的看懂之後其實並不複雜,需要大家靜下心來細細分析。