一元多项式运算

  1. #include<iostream>
  2. #include<malloc.h>
  3. #include<stdlib.h>
  4. using namespace std;
  5. #define OK 1
  6. #define ERROR 0
  7. #define OVERFLOW -2
  8. typedef struct polyn
  9. {
  10.      float coef;
  11.      int expn; 
  12.      struct polyn *next;
  13. }Elem,*polynomial;
  14. void CreatPolyn(polynomial &p,int n)         //创建多项式 
  15. {
  16.      p=(polynomial)malloc(sizeof(Elem));
  17.      p->expn=-1;
  18.      p->next=NULL;
  19.      polynomial q=p,r;
  20.      for(int i=0;i<n;i++)
  21.      {
  22.         q=(polynomial)malloc(sizeof(Elem));
  23.         cin>>q->coef>>q->expn;
  24.         if(!i) {p->next=q;r=q;}
  25.         else   {r->next=q;r=q;}
  26.      }
  27.      q->next=NULL;
  28.      }
  29. void Sort(polynomial &p,int n)           //排序 
  30. {
  31.      polynomial q,r,t;
  32.      int j;
  33.      bool change=true;
  34.      for(int i=n-1;i>0&&change;i--)
  35.      {
  36.         change=false;
  37.         for(r=p,q=p->next,j=0;q->next&&j<i;j++)
  38.         if(q->expn>q->next->expn) {
  39.                                   r->next=q->next;
  40.                                   t=q->next->next;
  41.                                   q->next->next=q;
  42.                                   q->next=t;
  43.                                   change=true;
  44.                                   r=r->next;}
  45.         else{r=q;q=q->next;}
  46.         }
  47. }
  48. void PrintPolyn(polynomial p)          //输出 
  49.      while(p=p->next)
  50.      cout<<p->coef<<" "<<p->expn<<endl;
  51.      cout<<endl;
  52.      }
  53. void AddPolyn(polynomial &La,polynomial &Lb)        //加法 
  54. {
  55.       polynomial qa=La->next,qb=Lb->next,qqa=La,t;
  56.       while(qa&&qb)                           
  57.         { if(qb->expn>qa->expn) {qqa=qa;qa=qa->next;}
  58.           else  if(qb->expn<qa->expn) {
  59.               qqa->next=qb;
  60.               t=qb;
  61.               qb=qb->next;
  62.               t->next=qa;}
  63.          else {
  64.               qa->coef+=qb->coef;
  65.               if(!qa->coef) {qqa->next=qa->next;
  66.                              free(qa);
  67.                              t=qb;
  68.                              qb=qb->next;
  69.                              free(t);
  70.                             qa=qqa->next;}
  71.               else    {qb=qb->next; qqa=qa;qa=qa->next;}
  72.                }
  73.          }
  74.       if(!qa&&qb) qqa->next=qb;
  75.      free(Lb);
  76. }
  77. void SubtractPolyn(polynomial &La,polynomial &Lb)          //减法 
  78. {
  79.     polynomial qa=La->next,qb=Lb->next,qqa=La,t;
  80.       while(qa&&qb)                           
  81.         { if(qb->expn>qa->expn) {qqa=qa;qa=qa->next;}
  82.           else  if(qb->expn<qa->expn) {
  83.               qb->coef=-qb->coef;
  84.               qqa->next=qb;
  85.               t=qb;
  86.               qb=qb->next;
  87.               t->next=qa;}
  88.          else {
  89.               qa->coef-=qb->coef;
  90.               if(!qa->coef) {qqa->next=qa->next;
  91.                              free(qa);
  92.                              t=qb;
  93.                              qb=qb->next;
  94.                              free(t);
  95.                             qa=qqa->next;}
  96.               else    {qb=qb->next; qqa=qa;qa=qa->next;}
  97.                }
  98.          }
  99.       if(!qa&&qb) {
  100.                   qqa->next=qb;
  101.                   while(qb)
  102.                      {
  103.                      qb->coef=-qb->coef;
  104.                      qb=qb->next;        }
  105.                      }
  106.      free(Lb);}
  107.     
  108. void CopyPolyn(polynomial &La,polynomial &Lb)         //复制 
  109. {
  110.      polynomial p,q,pp=La->next;
  111.      Lb=(polynomial)malloc(sizeof(Elem));
  112.      Lb->expn=-1;
  113.      for(;pp;pp=pp->next)
  114.        {
  115.         p=(polynomial)malloc(sizeof(Elem));
  116.         p->coef=pp->coef;
  117.         p->expn=pp->expn;
  118.         if(pp==La->next) {Lb->next=p;q=p;}
  119.         else {q->next=p;q=p;}
  120.                       }
  121.      p->next=NULL;    }
  122. void InsertPolyn(polynomial &La,polynomial &e)        //插入 
  123. {
  124.      polynomial pa=La,t;
  125.      while(pa->next&&pa->next->expn<e->expn)
  126.      pa=pa->next;    
  127.      if(!pa->next) {pa->next=e;e->next=NULL;}
  128.      else if(pa->next->expn>e->expn) {
  129.                          e->next=pa->next;
  130.                          pa->next=e;
  131.                          }
  132.      else if(pa->next->expn==e->expn) {
  133.                                 pa->next->coef+=e->coef;
  134.                                 if(!pa->next->coef) 
  135.                                 {
  136.                                     t=pa->next;
  137.                                     pa->next=pa->next->next;
  138.                                    // free(t);
  139.                                                  }
  140.                                    //free(e); 
  141.                                     } 
  142.    
  143. }
  144. void MultiplyPolyn(polynomial La,polynomial Lb,polynomial &Lc) //乘法 
  145. {
  146.      polynomial qa,qb=Lb,qq;
  147.      Lc=(polynomial)malloc(sizeof(Elem));
  148.      Lc->expn=-1;
  149.      Lc->next=NULL;
  150.       while(qb=qb->next)                           
  151.       {
  152.         for(qa=La->next;qa;qa=qa->next) 
  153.              {
  154.                qq=(polynomial)malloc(sizeof(Elem));
  155.                qq->coef=qa->coef*qb->coef;
  156.                qq->expn=qa->expn+qb->expn;
  157.                InsertPolyn(Lc,qq);}
  158.         }
  159. }
  160. int main()
  161. {
  162.     int np,nq;
  163.     polynomial p,q,m,r,y;
  164.     cin>>np;
  165.     CreatPolyn(p,np);
  166.     Sort(p,np);
  167.     PrintPolyn(p);
  168.     
  169.     cin>>nq;
  170.     CreatPolyn(q,nq);
  171.     Sort(q,nq);
  172.     PrintPolyn(q);
  173.     
  174.     CopyPolyn(q,r);
  175.     PrintPolyn(r);
  176.     
  177.     CopyPolyn(q,y);
  178.     PrintPolyn(y);
  179.      
  180.     AddPolyn(p,q);
  181.     PrintPolyn(p);
  182.     
  183.     SubtractPolyn(p,r);
  184.     PrintPolyn(p);
  185.     
  186.     MultiplyPolyn(p,y,m);
  187.     PrintPolyn(m);
  188.     
  189.     return 0;
  190.     }
  191.           3
  192.           2 1
  193.           3 0
  194.           1 3
  195.           3 0
  196.           2 1
  197.           1 3
  198.           
  199.           2
  200.           1 4
  201.           -2 1
  202.           -2 1
  203.           1 4
  204.           -2 1
  205.           1 4
  206.           -2 1
  207.           1 4
  208.           3 0
  209.           1 3
  210.           1 4
  211.           3 0
  212.           2 1
  213.           1 3
  214.           -6 1
  215.           -4 2
  216.           1 4
  217.           2 5
  218.           1 7
  219.           请按任意键继续. . .
  220.      
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值