以链表实现多项式加法,多项式以字符串的形式读取

实现多项式运算 部分计算器能够支持多项式的计算 ,本次实验中,要求你所实现的计算器也能够完成多项式运 算。 具体地,针对任意一个多项式,在 语言中,我们常通过一个链表存储其每一项的次数和系数, 即能完成一个多项式的存储。本次实验中,要求你将输入的多项式以链表形式存储,并通过操作链 表完成多项式的 加法 、 减法 和 乘法 。 实验中规定,多项式以字符串形式读取,如 ,你应该以 3x^3+2x^2-5x+1 的 形式输入,当其与多项式 5x^4-3x^3+5x+10 相加后,输出 5x^4+2x^2+11 。

思路:分别用xnum,jiajian,chengf(名称就直接借鉴那位博主了)三个数组标记不同符号的位置,再将所有类型的多项式进行分类,根据不同的类型的特点通过尾插法建立链表,分别用coef和exp表示系数和指数,这样就可以实现多项式的打印了,接着就是加法就好了,over!

给我1000首歌的时间!!!Wooo oh!这次的代码真的写了好久,因为不会高级的工具,就疯狂的分类。

思路借鉴了另一位大神博主的文章,但多项式的实现完全是自己一点一点细分出来的,实现结果如下图

话不多说,上代码!

#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);

void   main(void)
{
        SLNode* pnodeA,*pnodeB,*pnodeC;/*定义三个SLNode结构体型的指针变量*/
         printf( "Add 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,实现一元多项式相加*/
        printf( "\nAdd two polynomials:\n ");
        print(pnodeC);                                       /*调用函数print(),输出相加结果pondeC*/
        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&&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);                                                  
}
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);
        }

多项式的减法和乘法手打中,敬请期待呀!

如果觉得有用请点赞+关注呀!感谢感谢 !

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南游北归

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

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

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

打赏作者

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

抵扣说明:

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

余额充值