(更新以及bug修复)多项式的减法以及乘法,通过链表形式实现

继上一篇多项式加法带来多项式减法以及多项式乘法的实现。同时修复了上篇文章的一个bug

在建立链表的时候上篇文章有一个分类如下

else if(xnum[0]!=0&&xnum[0]!=1)

此时会带来以下的问题,即当输入的第一项的系数为十以内的正整数时无法正常运行

此时,我们只需将此行代码改为

else if((xnum[0]!=0&&jiajian[0]!=0)||(xnum[0]!=0&&xnum[0]!=1))

问题就被完美解决了,是不是一个good ball了呢(野球帝王师傅乱串bushi)

接着我们来看减法,减法与加法的思路一样,唯一要注意的一点就是在减法的时候区分减数和被减数,废话不多说,我们直接放代码

SLNode* pnodeSUT(SLNode* pnodeA, SLNode* pnodeB){
        SLNode *pnodeC,*p,*q,*r,*s;
        float x;
        p=pnodeA;
        q=pnodeB;
        pnodeC=(SLNode*)malloc(LEN);
        r=pnodeC;
        while(p!=NULL&&q!=NULL){
            if(p->exp==q->exp){
                x=p->coef-q->coef;
                if(x!=0){
                    s=(SLNode*)malloc(LEN);
                    s->coef=x;
                    s->exp=p->exp;
                    r->next=s;
                    r=s;
                }
                p=p->next;
                q=q->next;
            }
            else 
                if(p-> exp> q-> exp) {
                        s=(SLNode *)malloc(LEN);
                        s-> coef=p-> coef;
                        s-> exp=p-> exp;
                        r-> next=s;
                        r=s;
                        p=p-> next;
                     }
                else                 {
                        s=(SLNode*)malloc(LEN);
                        s-> coef=q-> coef;
                        s-> exp=q-> exp;
                        r-> next=s;
                        r=s;
                        q=q-> next;
                     }    
        }
        while(p!=NULL){
            s=(SLNode *)malloc(LEN);
            s->coef=p->coef;
            s->exp=p->exp;
            r->next=s;
            r=s;
            p=p->next;    
        }
        while(q!=NULL)   {                                                 /*复制pnodeA余下的部分*/
                s=(SLNode*)malloc(LEN);                         /*新开辟的一个内存单元,复制一个结点s*/
                s-> coef=(q-> coef)*(-1);
                s-> exp=q-> exp;
                r-> next=s;  
                r=s;                    
                q=q-> next;                                                     /*p指向下一个结点*/
        }
        r->next=NULL;
        s=pnodeC;                                                               /*删除pnodeC的头结点*/
        pnodeC=pnodeC-> next;
        free(s);                                                                 /*释放s所指向的内存空间*/
        return(pnodeC);        
}

接着我们来看乘法,首先思路是把两个多项式依次乘起来,先不进行合并同类项,接着写一个函数用于系数的排序,最后合并同类项即可。

我们先来看交换的代码(指的是值交换,而非结点的交换)

void change(SLNode*p,SLNode*q){
    float ct;
    int et;
    ct = p->coef;
    p->coef = q->coef;
    q->coef = ct;
    et = p->exp;
    p->exp = q->exp;
    q->exp = et;
}

接着是合并

SLNode* pnodeMULT(SLNode* pnodeA, SLNode* pnodeB){
    SLNode *pnodeC,*p,*q,*r,*s;
        float x,y;
        p=pnodeA;
        pnodeC=(SLNode*)malloc(LEN);
        r=pnodeC;
        while(p!=NULL){
            q=pnodeB;//这里要注意q的位置要放在两个while之间,这样才能完全遍历两个多项式的乘法
            while(q!=NULL){
                x=(p->coef)*(q->coef);
                y=(p->exp)+(q->exp);
                    s=(SLNode*)malloc(LEN);
                    s->coef=x;
                    s->exp=y;
                    r->next=s;
                    r=s;
                    q=q->next;
            }
            p=p->next;
        }
        r->next=NULL;
        s=pnodeC;                                                     /*删除pnodeC的头结点*/
        pnodeC=pnodeC-> next;
        free(s); 
    SLNode*p1;
    p1 = pnodeC;
        while ((p1->next) != NULL) {
            if ((p1->exp) < (p1->next->exp)) {
                change(p1, p1->next);
            }
            p1 = p1->next;
        }
        SLNode *q1;
    for (q1 = pnodeC; q1 != NULL&&q1->next != NULL;){
            if ((q1->exp) == (q1->next->exp)) {
                q1->coef += q1->next->coef;
                q1->next = q1->next->next;
            }
            else q1 = q1->next;         
    }
    return(pnodeC);
}

先排序再合并同类项的目的在于能够大大简化合并时的代码实现的难度

最后附上这次实验的完整代码

#include   <stdlib.h>
#include   <malloc.h>
#include   <stdio.h>
#include <string.h>
#include <conio.h>
#define   LEN     sizeof(SLNode)
typedef   struct   Node{
        int   coef;                                                  
        int   exp;                                                
        struct Node* next;                          
}SLNode;
 
SLNode* creat(void);  
void print(SLNode* head);
SLNode* pnodeADD(SLNode* pnodeA, SLNode* pnodeB);
SLNode* pnodeSUT(SLNode* pnodeA, SLNode* pnodeB);
SLNode* pnodeMULT(SLNode* pnodeA, SLNode* pnodeB);
void   main(void)
{
        SLNode* pnodeA,*pnodeB,*pnodeC,*pnodeD,*pnodeE;/*定义三个SLNode结构体型的指针变量*/
         printf( "Add two univariate polynomials\n ");
         printf( "Substruct two univariate polynomials\n ");
         printf( "Multiplication two univariate polynomials\n ");
        printf( "Please enter the first polynomial\n ");
        pnodeA=creat();                                     /*调用函数creat(),输入一元多项式pnodeA*的系数和指数,建立链表*/
        printf( "First polynomial:\n ");
        print(pnodeA);                                       /*调用函数print(),  输出一元多项式pnodeA*/
        printf( "\nPlease enter the second polynomial:\n ");
        pnodeB=creat();                                     /*调用函数creat(),输入一元多项式pnodeB*的系数和指数,建立链表*/
        printf( "Second polynomial:\n ");
        print(pnodeB);                                       /*调用函数print(),输出一元多项式pnodeB*/
        pnodeC=pnodeADD(pnodeA,pnodeB);     /*调用函数pnodeADD,实现一元多项式相加*/
        pnodeD=pnodeSUT(pnodeA,pnodeB);
        pnodeE=pnodeMULT(pnodeA,pnodeB);
        printf( "\nAdd two polynomials:\n ");
        print(pnodeC);                                       /*调用函数print(),输出相加结果pondeC*/
        printf("\n");
        printf( "\nSubtract two polynomials:\n ");
        print(pnodeD);
        printf( "\n ");
        printf("\nMultiplication two polynomials:\n");
        print(pnodeE);
        printf("\n");
}
SLNode*creat(void){
       SLNode*head,*p1,*p2;                          /*定义SLNode结构体类型的指针变量*/
       int n=0,xnum[100],xx=0,jiajian[100],jj=0,chengf[100],cc=0;                                                      /*n初始为0*/            
       p1=p2=(SLNode*)malloc(LEN);          
       char a[1000];
       gets(a);                                                            
       head=NULL;                                                  /*把头指针定义为空*/    
       while(a[n])                              /*系数不为空时,执行循环*/
                  {                                     
                           if(a[n]=='x')  {xnum[xx]=n; xx++;}
                           if(a[n]=='+'||a[n]=='-')  {jiajian[jj]=n; jj++;}
                           if(a[n]=='^')  {chengf[cc]=n; cc++;}
                           n++;
                  }
//对于第一项
                if(xnum[0]==0)  
                    p1-> coef=1;
                if(jiajian[0]==0&&xnum[0]==1)
                    p1-> coef=-1;
                else if((xnum[0]!=0&&jiajian[0]!=0)||(xnum[0]!=0&&xnum[0]!=1))
                    {
                      for(int ll=0;ll<xnum[0];ll++)
                        { 
                          if(ll==0)
                            {
                                    if(a[ll]>='0'&&a[ll]<='9')  p1-> coef=a[ll]-'0';
                                    if(a[ll]=='+')              p1-> coef=0;
                                    if(a[ll]=='-')              p1-> coef=0;
                            }
                          else                                  p1-> coef= (p1-> coef)*10+a[ll]-'0';
                           }
                     if(a[0]=='+')                     p1-> coef=(p1-> coef)*1;
                     if(a[0]=='-')                     p1-> coef=(p1-> coef)*(-1);
                    }
                  int jiajian1;
                  if((a[0]>='0'&&a[0]<='9')||xnum[0]==0)      jiajian1=jiajian[0];
                  else                                        jiajian1=jiajian[1];                           
                  for(int ll=chengf[0]+1;ll<jiajian1;ll++)
                  {
                    if(ll==chengf[0]+1)   p1-> exp=a[ll]-'0';
                    else                  p1-> exp= (p1-> exp)*10+a[ll]-'0';
                  }
                  head=p1;
                  p2=p1;
                  p1=(SLNode*)malloc(LEN);
//对于中间的项
                for(int tt=1;tt<xx-1;tt++)
                  {
                    int jiajian2;
                    if(a[0]=='+'||a[0]=='-')      jiajian2=jiajian[tt];     //判断第一个输入的是否是加减符号
                    else                          jiajian2=jiajian[tt-1];  
                if(jiajian2+1==xnum[tt])
                    p1-> coef=1;
                else{
                    for(int lt=jiajian2+1;lt<xnum[tt];lt++)
                  {
                    if(lt==jiajian2+1)        p1-> coef=a[lt]-'0';
                    else                      p1-> coef= (p1-> coef)*10+a[lt]-'0';
                  }
              }
                if(a[0]>='0'&&a[0]<='9')      
                  {
                    if(a[jiajian[tt-1]]=='+')       p1->coef= (p1->coef)*1;
                    if(a[jiajian[tt-1]]=='-')       p1->coef= (p1-> coef)*(-1);
                  }
                else                          
                  {
                    if(a[jiajian[tt]]=='+')       p1-> coef= (p1-> coef)*1;
                    if(a[jiajian[tt]]=='-')       p1-> coef= (p1-> coef)*(-1);
                  }
                 int jiajianmidexp;
                 if(a[0]=='+'||a[0]=='-')      jiajianmidexp=jiajian[tt+1];     //判断第一个输入的是否是加减符号
                 else                          jiajianmidexp=jiajian[tt];  
                 for(int lt=chengf[tt]+1;lt<jiajianmidexp;lt++)
                  {
                    if(lt==chengf[tt]+1)   p1-> exp=a[lt]-'0';
                    else                   p1-> exp= (p1-> exp)*10+a[lt]-'0';
                  }
             p2-> next=p1;
             p2=p1;
             p1=(SLNode*)malloc(LEN);                      
       }
   //对于最后一项  
   //-x^5+x^4+x^3+x^2 is able
            int jiajian3;
            if((a[0]>='0'&&a[0]<='9')||xnum[0]==0)      jiajian3=jiajian[xx-2];
            else                                        jiajian3=jiajian[xx-1];
              if(jiajian3+1==xnum[xx-1])
                    p1-> coef=1; 
              else{ 
              for(int lt=jiajian3+1;lt<xnum[xx-1];lt++)
               { 
                if(lt==jiajian3+1)   p1-> coef=a[lt]-'0';
                else                 p1-> coef= (p1-> coef)*10+a[lt]-'0';
                }
               } 
            if(a[jiajian3]=='+')      p1-> coef = (p1-> coef)*1;
            if(a[jiajian3]=='-')      p1-> coef = (p1-> coef)*(-1);
            if(jj==xx-1||(jiajian[0]==0&&jj==xx)){ 
             if(cc==xx){
              for(int lt=chengf[xx-1]+1;lt<n;lt++)
               {
                 if(lt==chengf[xx-1]+1)   p1-> exp=a[lt]-'0';
                 else                     p1-> exp= (p1-> exp)*10+a[lt]-'0';
               }
              } 
             else  p1->exp=1; 
             p2-> next=p1;
             p2=p1;
             //p1=(SLNode*)malloc(LEN);
             p2-> next=NULL;                                          /*置结束标志为NULL*/
             return(head);
            }
            if(jj==xx+1||(jj==xx&&jiajian[0]!=0)){
             if(cc==xx){
              for(int lt=chengf[xx-1]+1;lt<jiajian[jj-1];lt++)
               {
                 if(lt==chengf[xx-1]+1)   p1-> exp=a[lt]-'0';
                 else                     p1-> exp= (p1-> exp)*10+a[lt]-'0';
               }
              } 
             else  p1->exp=1;
             p2-> next=p1;
             p2=p1;
             p1=(SLNode*)malloc(LEN);
             p1->exp=0;
             for(int ww=jiajian[jj-1]+1;ww<n;ww++){
                 if(ww==jiajian[jj-1]+1)   p1->coef=a[ww]-'0';
                 else                      p1->coef=(p1->coef)*10+a[ww]-'0';
             }
             if(a[jiajian[jj-1]]=='+')      p1-> coef = (p1-> coef)*1;
             if(a[jiajian[jj-1]]=='-')      p1-> coef = (p1-> coef)*(-1);
             p2->next=p1;
             p2=p1;
             p2-> next=NULL;                                          /*置结束标志为NULL*/
             return(head);
            }
            
            }
                                                    /*返回值为头指针的地址*/
 
 
SLNode* pnodeADD(SLNode* pnodeA,SLNode* pnodeB){
        SLNode*pnodeC,*p,*q,*s,*r;                           /*定义SLNode结构体类型的指针变量*/
        float x;                                                                                
        p=pnodeA;                                                               /*p指向pnodeA的头结点*/
        q=pnodeB;                                                               /*q指向pnodeB的头结点*/
        pnodeC=(SLNode*)malloc(LEN);                         /*pnodeC指向新开辟的内存单元*/
        r=pnodeC;                                                                
        while(p!=NULL&&q!=NULL){
            if(p-> exp==q-> exp)   {                                 /*两结点指数相等时,将两系数相加生成新结点插入C中          */      
                        x=p-> coef+q-> coef;                             /*系数相加*/        
                        if(x!=0){                                              
                                s=(SLNode*)malloc(LEN);
                                s-> coef=x;
                                s-> exp=p-> exp;                            
                                r-> next=s;                                    
                                r=s;
            }
                        p=p-> next;
                        q=q-> next;
          }
            else                                                                 /*两结点的指数不相等时,将其中较小系数的结点复制成一个新的结点插入C中*/
                        if(p-> exp> q-> exp)
      {
                        s=(SLNode *)malloc(LEN);
                        s-> coef=p-> coef;
                        s-> exp=p-> exp;
                        r-> next=s;
                        r=s;
                        p=p-> next;
          }
                else   {
                        s=(SLNode*)malloc(LEN);
                        s-> coef=q-> coef;
                        s-> exp=q-> exp;
                        r-> next=s;
                        r=s;
                        q=q-> next;
          }
               
        }
        while(p!=NULL)   {                                                 /*复制pnodeA余下的部分*/
                s=(SLNode*)malloc(LEN);                         /*新开辟的一个内存单元,复制一个结点s*/
                s-> coef=p-> coef;                                          
                s-> exp=p-> exp;
                r-> next=s;  
                r=s;
                p=p-> next;                                                     /*p指向下一个结点*/
        }
        while(q!=NULL)   {                                                 /*复制pnodeA余下的部分*/
                s=(SLNode*)malloc(LEN);                         /*新开辟的一个内存单元,复制一个结点s*/
                s-> coef=q-> coef;
                s-> exp=q-> exp;
                r-> next=s;  
                r=s;                    
                q=q-> next;                                                     /*p指向下一个结点*/
        }
        r-> next=NULL;                                                       /*置结束标志为NULL*/
        s=pnodeC;                                                               /*删除pnodeC的头结点*/
        pnodeC=pnodeC-> next;
        free(s);                                                                 /*释放s所指向的内存空间*/
        return(pnodeC);                                                  
}

SLNode* pnodeSUT(SLNode* pnodeA, SLNode* pnodeB){
        SLNode *pnodeC,*p,*q,*r,*s;
        float x;
        p=pnodeA;
        q=pnodeB;
        pnodeC=(SLNode*)malloc(LEN);
        r=pnodeC;
        while(p!=NULL&&q!=NULL){
            if(p->exp==q->exp){
                x=p->coef-q->coef;
                if(x!=0){
                    s=(SLNode*)malloc(LEN);
                    s->coef=x;
                    s->exp=p->exp;
                    r->next=s;
                    r=s;
                }
                p=p->next;
                q=q->next;
            }
            else 
                if(p-> exp> q-> exp) {
                        s=(SLNode *)malloc(LEN);
                        s-> coef=p-> coef;
                        s-> exp=p-> exp;
                        r-> next=s;
                        r=s;
                        p=p-> next;
                     }
                else                 {
                        s=(SLNode*)malloc(LEN);
                        s-> coef=q-> coef;
                        s-> exp=q-> exp;
                        r-> next=s;
                        r=s;
                        q=q-> next;
                     }    
        }
        while(p!=NULL){
            s=(SLNode *)malloc(LEN);
            s->coef=p->coef;
            s->exp=p->exp;
            r->next=s;
            r=s;
            p=p->next;    
        }
        while(q!=NULL)   {                                                 /*复制pnodeA余下的部分*/
                s=(SLNode*)malloc(LEN);                         /*新开辟的一个内存单元,复制一个结点s*/
                s-> coef=(q-> coef)*(-1);
                s-> exp=q-> exp;
                r-> next=s;  
                r=s;                    
                q=q-> next;                                                     /*p指向下一个结点*/
        }
        r->next=NULL;
        s=pnodeC;                                                               /*删除pnodeC的头结点*/
        pnodeC=pnodeC-> next;
        free(s);                                                                 /*释放s所指向的内存空间*/
        return(pnodeC);        
}
void change(SLNode*p,SLNode*q){
    float ct;
    int et;
    ct = p->coef;
    p->coef = q->coef;
    q->coef = ct;
    et = p->exp;
    p->exp = q->exp;
    q->exp = et;
}
SLNode* pnodeMULT(SLNode* pnodeA, SLNode* pnodeB){
    SLNode *pnodeC,*p,*q,*r,*s;
        float x,y;
        p=pnodeA;
        pnodeC=(SLNode*)malloc(LEN);
        r=pnodeC;
        while(p!=NULL){
            q=pnodeB;
            while(q!=NULL){
                x=(p->coef)*(q->coef);
                y=(p->exp)+(q->exp);
                    s=(SLNode*)malloc(LEN);
                    s->coef=x;
                    s->exp=y;
                    r->next=s;
                    r=s;
                    q=q->next;
            }
            p=p->next;
        }
        r->next=NULL;
        s=pnodeC;                                                               /*删除pnodeC的头结点*/
        pnodeC=pnodeC-> next;
        free(s); 

    SLNode*p1;
    p1 = pnodeC;
        while ((p1->next) != NULL) {
            if ((p1->exp) < (p1->next->exp)) {
                change(p1, p1->next);
            }
            p1 = p1->next;
        }
        SLNode *q1;
    for (q1 = pnodeC; q1 != NULL&&q1->next != NULL;){
            if ((q1->exp) == (q1->next->exp)) {
                q1->coef += q1->next->coef;
                q1->next = q1->next->next;
            }
            else q1 = q1->next;
    }
    return(pnodeC);
}

void   print(SLNode* head){                    
        SLNode* p;                                                                     /*定义SLNode结构体类型的指针变量*/
       p=head;                                                                             /*把头指针的地址赋给p*/
        if(head!=NULL){
         if(p-> coef==1&&p-> exp!=0&&p-> exp!=1)
           printf( "x^%d",p-> exp);
         if(p-> coef==-1&&p-> exp!=0&&p-> exp!=1)
           printf( "-x^%d",p-> exp);
         if(p-> coef==1&&p-> exp==0)
           printf( "1");
         if(p-> coef==-1&&p-> exp==0)
           printf( "-1");
         if(p-> coef==-1&&p-> exp==1)
           printf( "-x");
         if(p-> coef==1&&p-> exp==1)
           printf( "x");
         if(p-> coef!=-1&&p-> coef!=1&&p-> exp==0)  
           printf( "%d",p-> coef);
         if(p-> coef!=1&&p-> coef!=-1&&p-> exp==1)
           printf( "%dx",p-> coef);
         if(p-> coef!=1&&p-> coef!=-1&&p-> coef!=0&&p-> exp!=0&&p-> exp!=1&&p-> exp!=-1)
            printf( "%dx^%d",p-> coef,p-> exp);
        p=p-> next;
    }
do{      
         if(p-> coef> 1)    
            printf("+");
         if(p-> coef==1&&p-> exp!=0&&p-> exp!=1)
            printf( "+x^%d",p-> exp);
         if(p-> coef==1&&p-> exp==0)
            printf( "+1");
         if(p-> coef==-1&&p-> exp!=0&&p-> exp!=1)
            printf( "-x^%d",p-> exp);
         if(p-> coef==-1&&p-> exp==1)
            printf( "-x");
         if(p-> coef==1&&p-> exp==1)
            printf( "+x");
         if(p-> coef==-1&&p-> exp==0)
            printf( "-1");
         if(p-> coef!=-1&&p-> coef!=1&&p-> exp==0)  
            printf( "%d",p-> coef);
         if(p-> coef!=1&&p-> coef!=-1&&p-> exp==1)
            printf( "%dx",p-> coef);
         else if(p-> coef!=1&&p-> coef!=-1&&p-> coef!=0&&p-> exp!=0&&p-> exp!=1)
            printf( "%dx^%d",p-> coef,p-> exp);
       p=p-> next;
}while(p!=NULL);
        }

    

感谢您的观看,有用的话希望点赞收藏加关注呀!谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南游北归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值