多项式的c语言算法实现(包含加、减、乘。除法还未写好)

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
  float exof;//系数
  int expn;//指数
}DataNode;
typedef struct Node
{
  DataNode data;
  struct Node *next;
}PolyNode,*Polynomial;
typedef enum {error,ok,fail,success}Status;
Status CreatPoly(Polynomial &poly,int n)//正序法创建多项式
{
  Polynomial head,tail,current;//定义头、尾和当前节点
  float exof;
  int expn;
  head=(Polynomial)malloc(sizeof(PolyNode));
  if(!head) return fail;
  head->next=NULL;
  poly=head;
  tail=head;
  printf("请输入多项式的系数和指数!/n");
  for(int i=0;i<n;i++)
  {
    
     current=(Polynomial)malloc(sizeof(PolyNode));
     if(!current) return fail;
     current->next=tail->next;//哥曾经犯错误的地方
     tail->next=current;
     scanf("%f%d",&exof,&expn);
  fflush(stdin);
  (current->data).exof=exof;
  (current->data).expn=expn;
  //lush(stdin);
  //printf("jajklfs");
     tail=current;
   }
   return success;
}
/*Status CreatbPoly(Polynomial &poly,int n)//正序法创建多项式
{
  Polynomial head,tail,current;//定义头、尾和当前节点
  float exof;
  int expn;
  head=(Polynomial)malloc(sizeof(PolyNode));
  if(!head) return fail;
  head->next=NULL;
  poly=head;
  tail=head;
  printf("请输入多项式的系数和指数!/n");
  for(int i=0;i<n;i++)
  {
    
     current=(Polynomial)malloc(sizeof(PolyNode));
     if(!current) return fail;
     current->next=tail->next;//哥曾经犯错误的地方
     tail->next=current;
     scanf("%f%d",&exof,&expn);
  fflush(stdin);
  (current->data).exof=exof;
  (current->data).expn=expn;
  //lush(stdin);
  //printf("jajklfs");
     tail=current;
   }
   return success;
}*/
Status InsertPoly(Polynomial &poly,int pos)//插入节点
{
 Polynomial newpoly;
 int i=0;
 newpoly=(Polynomial)malloc(sizeof(PolyNode));
 if(!newpoly) return fail;
 printf("请输入要插入多项式元素的系数和指数/n");
 scanf("%f %d",&(newpoly->data.exof),&(newpoly->data.expn));
 while(poly&&i<pos-1)
 {
     poly=poly->next;
 }
 newpoly->next=poly->next;
 poly->next=newpoly;
 return success;
}
Status DeletePoly(Polynomial &poly,int pos)
{
 Polynomial tempoly;
 int i=0;
 //tempoly=(Polynomial)malloc(sizeof(PoluNode));
 //if(!newpoly) return fail;
 //printf("请输入要插入多项式元素的系数和指数/n");
 //scanf("%f %d",&(newpoly->daya.exof),&(newpoly->data.expn));
 while(poly&&i<pos-1)
 {
     poly=poly->next;
 }
 tempoly=poly->next;
 poly->next=tempoly->next;
 free(tempoly);
 return success;
}
Status ReplacePoly(Polynomial &poly,int pos)
{
 Polynomial newpoly,tempoly;
 int i=0;
 newpoly=(Polynomial)malloc(sizeof(PolyNode));
 if(!newpoly) return fail;
 printf("请输入要插入多项式元素的系数和指数/n");
 scanf("%f %d",&(newpoly->data.exof),&(newpoly->data.expn));
 while(poly&&i<pos-1)
 {
     poly=poly->next;
 }
 tempoly=poly->next;
 newpoly->next=tempoly->next;
 poly->next=newpoly;
 free(tempoly);
 return success;
}
int Compare(Polynomial &pa,Polynomial &pb)//多项式的指数大小比较,pa>pb 返回1;pa=pb 返回0;pa<pb 返回-1;
{
 //pa=pa->next;pb=pa->next;
 if((pa->data).expn >(pb->data).expn)
 {
  return 1;
 }
 else if((pa->data).expn==(pb->data).expn)
 {
  return 0;
 }
 else if((pa->data).expn<(pb->data).expn)
 {
  return -1;
 }
 else
  return -2;
 
}
void AddPoly(Polynomial &pa,Polynomial &pb)//多项式加法
{
    Polynomial heada,headb,priora,priorb;
 
 priora=pa;
 priorb=pb;

 heada=priora;
 headb=priorb;
 pa=pa->next;pb=pb->next;
 //printf("请输入未知数x的值:/n");
 while(pa&&pb)
 {
  
  if(Compare(pa,pb)==1)
  {
   priora->next=pb;
   priorb->next=pb->next;
   pb->next=pa;

   priora=pb;
   pb=priorb->next;
  }
  else if(Compare(pa,pb)==0)
  {
   pa->data.exof=pa->data.exof+pb->data.exof;
   priora=pa;priorb=pb;
   pa=pa->next;pb=pb->next;
  }
  else if(Compare(pa,pb)==-1)
  {
   priora=pa;
   pa=pa->next;
  }
  
 }
 if(!pa&&pb)
 {
  priora->next=pb;
  priorb=pb->next;
 }
    pb=headb;
    pa=heada;

}
void SubPoly(Polynomial &pa,Polynomial &pb)//多项式减法
{
    Polynomial heada,headb,priora,priorb;
 
 priora=pa;
 priorb=pb;

 heada=priora;
 headb=priorb;
 pa=pa->next;pb=pb->next;
 //printf("请输入未知数x的值:/n");
 while(pa&&pb)
 {
  
  if(Compare(pa,pb)==1)
  {
   pb->data.exof=-(pb->data.exof);
   priora->next=pb;
   priorb->next=pb->next;
   pb->next=pa;

   priora=pb;
   pb=priorb->next;
  }
  else if(Compare(pa,pb)==0)
  {
   pa->data.exof=pa->data.exof-pb->data.exof;
   priora=pa;priorb=pb;
   pa=pa->next;pb=pb->next;
  }
  else if(Compare(pa,pb)==-1)
  {
   priora=pa;
   pa=pa->next;
  }
  
 }
 if(!pa&&pb)
 {
  priora->next=pb;
  //priorb=pb->next;
     while(pb)
  {
   pb->data.exof=-(pb->data.exof);
   pb=pb->next;
  }
 }
    free(headb);
 pa=heada;

}
void MulPoly(Polynomial &pa,Polynomial &pb)//多项式乘法
{
 /* pa的第一项乘以pb的每一项,把相乘的结果放到temppa(存放第一次乘法结果)和temppb(从第二次乘法开始的每一次乘法结果都放到temppb中)中,
 然后进行相加,每循环一次乘法,temppa与temppb进行加法一次,加法结果放到temppa链表中。
 
 */
 Polynomial heada,headb,priora,priorb,temppa,temppb,tempha,temphb;
 float sum=0;
 int i=0;
 heada=pa;
 headb=pb;
 priora=pa;priorb=pb;
 pa=pa->next;pb=pb->next;//指向第一个节点
 tempha=(Polynomial)malloc(sizeof(PolyNode));//新创临时头节点
 tempha->next=NULL;
 temphb=(Polynomial)malloc(sizeof(PolyNode));//新创临时头节点
 temphb->next=NULL;
 for(pa;pa!=NULL;pa=pa->next)
 {
  for(pb=priorb->next;pb!=NULL;pb=pb->next)
  {
   if(i<1)
   {
    temppa=(Polynomial)malloc(sizeof(PolyNode));
    temppa->data.exof=(pa->data.exof)*(pb->data.exof);
    temppa->data.expn=(pa->data.expn)+(pb->data.expn);
    temppa->next=tempha->next;
    tempha->next=temppa;
    
    
   }
   else
   {
    temppb=(Polynomial)malloc(sizeof(PolyNode));
    temppb->data.exof=pa->data.exof*pb->data.exof;
    temppb->data.expn=pa->data.expn+pb->data.expn;
    temppb->next=temphb->next;
    temphb->next=temppb;
    AddPoly(tempha,temphb);
    temphb->next=NULL;
   /* Polynomial tphb,temp;
    tphb=temphb;
    temphb=temphb->next;
    while(temphb)
    {
     temp=temphb;
     free(temp);
     temphb=temphb->next;
    }
    temphb=tphb;
    */
   }
   
  }
  
  i++;
 }
 pa=tempha;
}
void DivPoly(Polynomial &pa,Polynomial &pb)//多项式除法
{

}
float PrintResult(Polynomial &pa,float x)//输出结果
{
 float sum=1.0,totalsum=0.0;
 Polynomial head;
 head=pa;
 pa=pa->next;//指向第一个节点
 while(pa)
 {
  for(int i=0;i<(pa->data).expn;i++)
  {
   sum=sum*x;
  }
  sum=sum*(pa->data).exof;
  totalsum+=sum;
  pa=pa->next;
  sum=1.0;

 }
 pa=head;
 return totalsum;
}
void main()
{
   Polynomial polya,polyb;//定义两个多项式
   int flag0,flag1;//循环标志
   int na,nb;//多项式的元素个数
   int posa,posb;//修改操作多项式元素的位置
   char cflag='/0',coflag='/0';//修改多项式标志
   Status sacflag=fail,sbcflag=fail;//创建多项式结果标志
   Status siflag=fail,sdflag=fail,srflag=fail;//插入返回标志、删除返回标志、替换返回标志
   float fsumresult;//运算结果
   float x;
   printf("   线性表的应用——多项式/n");
   while(flag0!=0)//交互界面循环
  {
   printf("请选择操作:/n");
   printf("1  创建多项式  2  多项式加法/n");
   printf("3  修改多项式  4  多项式减法/n");
   printf("5  多项式乘法  6  多项式除法/n");
   printf("0  退出操作/n");
   scanf("%d",&flag1);
   switch(flag1)
   {                   //操作选择控制
   case 1:
         printf("请输入要创建的多项式a元素个数/n");
         scanf("%d",&na);
         sacflag=CreatPoly(polya,na);
   if(sacflag==success)
            printf("创建多项式a成功!/n");
         else if(sacflag==fail)
            printf("创建多项a失败!/n");
   printf("请输入要创建的多项式b元素个数/n");
         scanf("%d",&nb);
         sbcflag=CreatPoly(polyb,nb);
         if(sbcflag==success)
            printf("创建多项式b成功!/n");
         else if(sbcflag==fail)
            printf("创建多项式b失败!/n");
         break;
   case 2:
         if(sacflag!=success||sbcflag!=success)
           printf("请先创建多项式/n");
         else
         {
  // printf("请输入未知数x的值:/n");
            AddPoly(polya,polyb);
            printf("请输入未知数x的值:/n");
   scanf("%f",&x);
            printf("加法运算结果为:/n");
            fsumresult=PrintResult(polya,x);
   printf("%f/n",fsumresult);
         }
         break;
   case 3:
        if(sacflag!=success||sbcflag!=success)
           printf("请先创建多项式/n");
         else
         {
            printf("请选择要修改的多项式:/n");
            printf("a  修改多项式polya  b  修改多项式polyb/n");
   printf("请输入要修改的对象:/n");
   fflush(stdin);
            cflag=(char)getchar();
   //scanf("%c",&cflag);
   fflush(stdin);//哥在这里犯过错误
   //printf("请输入要修改的对象:/n");
            switch(cflag)
            {
               case 'a':
                        printf("请输入要修改多项式的操作:/n");
                        printf("a  添加多项式的元素项  d  删除多项式的元素项/n");
                        printf("r  替换多项式的元素项/n");
                        coflag=getchar();
                        switch(coflag)
                        {
      case 'a':
                                    printf("请输入要添加的多项式元素位置posa/n");
                                    scanf("%d",&posa);
                                    siflag=InsertPoly(polya,posa);
                                    if(siflag==success)
                                       printf("添加多项式元素成功!/n");
                                    else if(siflag==fail)
                                       printf("添加多项式元素失败!/n");
                                    break;
      case 'd':
                                    printf("请输入要删除的多项式元素位置posa/n");
                                    scanf("%d",&posa);
                                    siflag=DeletePoly(polya,posa);
                                    if(siflag==success)
                                       printf("删除多项式元素成功!/n");
                                    else if(siflag==fail)
                                       printf("删除多项式元素失败!/n");
                                    break;
      case 'r':
                                    printf("请输入要替换的多项式元素位置posa/n");
                                    scanf("%d",&posa);
                                    siflag=ReplacePoly(polya,posa);
                                    if(siflag==success)
                                       printf("替换多项式元素成功!/n");
                                    else if(siflag==fail)
                                       printf("替换多项式元素失败!/n");
                                    break;
                        }
                        break;
              case 'b':
                        printf("请输入要修改多项式的操作:/n");
                        printf("a  添加多项式的元素项  d  删除多项式的元素项/n");
                        printf("r  替换多项式的元素项/n");
                        coflag=getchar();
                        switch(coflag)
                        {
      case 'a':
                                    printf("请输入要添加的多项式元素位置posb/n");
                                    scanf("%d",&posb);
                                    siflag=InsertPoly(polyb,posb);
                                    if(siflag==success)
                                       printf("添加多项式元素成功!/n");
                                    else if(siflag==fail)
                                       printf("添加多项式元素失败!/n");
                                    break;
      case 'd':
                                    printf("请输入要删除的多项式元素位置posb/n");
                                    scanf("%d",&posb);
                                    siflag=DeletePoly(polyb,posb);
                                    if(siflag==success)
                                       printf("删除多项式元素成功!/n");
                                    else if(siflag==fail)
                                       printf("删除多项式元素失败!/n");
                                    break;
      case 'r':
                                    printf("请输入要替换的多项式元素位置posb/n");
                                    scanf("%d",&posb);
                                    siflag=ReplacePoly(polyb,posb);
                                    if(siflag==success)
                                       printf("替换多项式元素成功!/n");
                                    else if(siflag==fail)
                                       printf("替换多项式元素失败!/n");
                                    break;
                        }
     default:
                           break;
            }
        }
   break;
  case 4:
  if(sacflag!=success||sbcflag!=success)
           printf("请先创建多项式/n");
        else
        {
            SubPoly(polya,polyb);
   printf("请输入未知数x的值:/n");
   scanf("%f",&x);
            printf("减法运算结果为:/n");
            fsumresult=PrintResult(polya,x);
   printf("%f/n",fsumresult);
        }
        break;  
  case 5:
  if(sacflag!=success||sbcflag!=success)
           printf("请先创建多项式/n");
        else
        {
            MulPoly(polya,polyb);
            printf("请输入未知数x的值:/n");
   scanf("%f",&x);
            printf("乘法运算结果为:/n");
            fsumresult=PrintResult(polya,x);
   printf("%f/n",fsumresult);
        }
        break;  
  case 6:
  if(sacflag!=success||sbcflag!=success)
           printf("请先创建多项式/n");
        else
        {
            DivPoly(polya,polyb);
            printf("请输入未知数x的值:/n");
   scanf("%f",&x);
            printf("除法运算结果为:/n");
            fsumresult=PrintResult(polya,x);
   printf("%f",fsumresult);
        }
        break;
  case 0:
        flag0=0;
        break; 
 default :
     break;

    }
  }
}

//请高手多多指点,在次谢过。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值