解析多项式运算

    作为一名数据结构的初学者,刚开始接触到算法思想,我表示还是有一些难度。学到的知识不能和实际问题联系起来是我最大的问题,有时候问题的算法思想懂得,但是到了敲代码的时候,却不知道从何下手,不过还是要对自己有信心啦,只要好好学,肯定会慢慢进步的。

    

 

      -----------------------------------------------------------------------------

  

    回归正题,多项式的各种运算其实不是那么困难,最关键的就是具备统筹思想,在敲每一种运算之前,都要事先想好自己的思路,那样就可以流畅的敲完代码了,每写一行代码,就想一下逻辑有没有出错,避免在编译过程中没有出错,运行时却出现错误。为了找bug,浪费本该做别的事的时间。

     思想:

       1.创建链表,将多项式以链表形式存放

       2.多项式加法:1)当两个多项式均未扫描完毕,比较两个多项式的指数进行相应的运算

                      2)当其中一个表达式已经结束,令一个表达式还未结束,则直接把剩余的项链接在求和之后的链表后面

       3.多项式减法:与多项式加法的思想一致

       4.多项式乘法:了解多项式乘法的机制:第一个多项式的每一项分别与第二个多项式的每一项相乘,然后合并同类项

          5.多项式的输出:为了便于操作,我们用链表存储多项式,但是最后得输出一个读者能一眼认出的多项式

 

 

    

#include<stdio.h>
#include<stdlib.h>

typedef struct rolynomial
{
  float coef;
  int expn;
  struct rolynomial *next;

}rolyn;

rolyn *creatroly()                           //尾差法建立多项式
{
 float x;
 int y;
 rolyn *head,*p,*q;

 head=(rolyn *)malloc(sizeof(rolyn));
 p=head;
 printf("please input the coef and expn:\n");
 scanf("%f%d",&x,&y);
 while(x!=0)
 {
   q=(rolyn *)malloc(sizeof(rolyn));
   q->coef=x;
   q->expn=y;
   p->next=q;
   p=q;
   printf("please input the coef and expn:\n");
   scanf("%f %d",&x,&y);
 }
 p->next=NULL;
 return (head);
}


rolyn *addroly(rolyn *pa,rolyn *pb)          //两个多项式相加
{
  rolyn *qa,*qb;
  rolyn *headc,*pc,*qc;

  qa=pa->next;
  qb=pb->next;
  pc=(rolyn *)malloc(sizeof(rolyn));
  headc=pc;
  pc->next=NULL;
  while(qa!=NULL&&qb!=NULL)              //当两个多项式均未扫描完时
  {
 qc=(rolyn *)malloc(sizeof(rolyn));
    if(qa->expn<qb->expn)
 {
   qc->coef=qa->coef;
   qc->expn=qa->expn;
   qa=qa->next;
 }
 else if(qa->expn==qb->expn)
 {
   qc->coef=qa->coef+qb->coef;
   qc->expn=qa->expn;
   qa=qa->next;
   qb=qb->next;

 }
 else
 {
   qc->coef=qb->coef;
   qc->expn=qb->expn;
   qb=qb->next;
 }
    if(qc->coef!=0)
 {
  qc->next=pc->next;
  pc->next=qc;
  pc=qc;
 }
 else
 {
   free(qc);
 }
  }
  while(qa!=NULL)                              //如果pa有剩余项
  {
    qc=(rolyn *)malloc(sizeof(rolyn));

 qc->coef=qa->coef;
 qc->expn=qa->expn;
 qa=qa->next;
 qc->next=pc->next;
 pc->next=qc;
 pc=qc;
  }
  while(qb!=NULL)                               //如果pb有剩余项
  {
    qc=(rolyn *)malloc(sizeof(rolyn));
 qc->coef=qb->coef;
 qc->expn=qb->expn;
 qb=qb->next;
 qc->next=pc->next;
 pc->next=qc;
 pc=qc;
  }
  return headc;
}
void cheng(rolyn *pa,rolyn *pb,rolyn *head )        //多项式乘法
{
  rolyn *qa, *qb,*pc,*qc,*t;
  qa=pa->next;
  qb=pb->next;
  pc=head;

  t=qb;
  while(qa)
  {
   
 while(qb)
 {
   qc=(rolyn *)malloc(sizeof(rolyn));
    qc->coef=qa->coef*qb->coef;
    qc->expn=qa->expn+qb->expn;
    pc->next=qc;
       pc=qc;
       qb=qb->next;
 }
 qa=qa->next;
 qb=t;
  }
  qc->next=NULL;
 }
void sum(rolyn *head)                  //合并同类项
{
  rolyn *p,*q,*t,*m;
  p=head->next;
  while(p)

  {
   m=p;
      q=p->next;
    while(q)
   {
     if(p->expn==q->expn)
  {
    p->coef=p->coef+q->coef;
    m->next=q->next;
    t=q;
    q=q->next;
    free(t);
  }
  else
  {
    q=q->next;
    m=m->next;
  }
   }
   p=p->next;
  }

}

void printroly(rolyn *p)       //输出多项式
{
  rolyn *q;
  q=p->next;
  int flag=1;
  if(!q)
  {
    putchar('0');
 printf("\n");
  }
  while(q)
  {
   if(q->coef>0&&flag!=1)
   {
     putchar('+');
   }
   if(q->coef!=1&&q->coef!=-1)
   {
     printf("%f",q->coef);
  if(q->expn==1) printf("x");
  else if(q->expn) printf("x^%d",q->expn);
   }
   else
   {

     if(q->coef==1)
  {
    if(!q->expn)  putchar('1');
    else if(q->expn==1) putchar('x');
    else  printf("x^%d",q->expn);
  }
  if(q->coef==-1)
  {
    if(!q->expn)   putchar('-1');
    else if(q->expn==1)  putchar('-x');
    else  printf("-x^%d",q->expn);
  }
   }
   q=q->next;
   flag++;
  }
  printf("\n");
}

int main()
{
  rolyn *heada,*headb,*head;
  heada=creatroly();                        //创建a多项式
  printroly(heada);    
  headb=creatroly();                           //创建b多项式

  printroly(headb);
  head=addroly(heada,headb);                   //多项式的和
  printroly(head);
  cheng(heada,headb,head);
  printroly(head);  //多项式乘法
  sum(head);
  printroly(head);
  return 0;
}

  

  这是一个可以运行的代码,思想正确,但是代码有一些繁琐,希望读者能给一些宝贵的意见,谢谢

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值