线性表--一元多项式相加

任务:本程序是一个控制台程序,用户可以根据自己的需求输入两个一元多项式,并且能够实现显示两个多项式,再将这两个多项式相加,输出结果。

注意:本程序的输入需求是按照指数的从小到大进行输入,并且项数必须为正整数,指数需为整数,系数为双精度型且不能为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;
     }

总结:代码有点冗长,但是真正的看懂之后其实并不复杂,需要大家静下心来细细分析。

猜你喜欢

转载自blog.csdn.net/qq_41751401/article/details/84763204