bo2-7.cpp 多项式(存储结构由c2-6.h定义)的基本操作及算法

  1.  // bo2-7.cpp 多项式(存储结构由c2-6.h定义)的基本操作及算法2.22、2.23等(8个)
  2.  #include"c2-5.h"
  3.  #include"bo2-6.cpp"
  4.  typedef LinkList polynomial;
  5.  #define DestroyPolyn DestroyList // 与bo2-6.cpp中的函数同义不同名
  6.  #define PolynLength ListLength // 与bo2-6.cpp中的函数同义不同名
  7.  void OrderInsertMerge(LinkList &L,ElemType e,int(* compare)(term,term))
  8.  { // 按有序判定函数compare()的约定,将值为e的结点插入或合并到升序链表L的适当位置
  9.    Position q,s;
  10.    if(LocateElem(L,e,q,compare)) // L中存在该指数项
  11.    {
  12.      q->data.coef+=e.coef; // 改变当前结点系数的值
  13.      if(!q->data.coef) // 系数为0
  14.      { // 删除多项式L中当前结点
  15.        s=PriorPos(L,q); // s为当前结点的前驱
  16.        if(!s) // q无前驱
  17.          s=L.head;
  18.        DelFirst(L,s,q);
  19.        FreeNode(q);
  20.      }
  21.    }
  22.    else // 生成该指数项并插入链表
  23.    {
  24.      MakeNode(s,e); // 生成结点
  25.      InsFirst(L,q,s);
  26.    }
  27.  }
  28.  int cmp(term a,term b) // CreatPolyn()的实参
  29.  { // 依a的指数值<、=或>b的指数值,分别返回-1、0或+1
  30.    if(a.expn==b.expn)
  31.      return 0;
  32.    else
  33.      return (a.expn-b.expn)/abs(a.expn-b.expn);
  34.  }
  35.  void CreatPolyn(polynomial &P,int m) // 算法2.22
  36.  { // 输入m项的系数和指数,建立表示一元多项式的有序链表P
  37.    Position q,s;
  38.    term e;
  39.    int i;
  40.    InitList(P);
  41.    printf("请依次输入%d个系数,指数:/n",m);
  42.    for(i=1;i<=m;++i)
  43.    { // 依次输入m个非零项(可按任意顺序)
  44.      scanf("%f,%d",&e.coef,&e.expn);
  45.      if(!LocateElem(P,e,q,cmp)) // 当前链表中不存在该指数项,cmp是实参
  46.      {
  47.        MakeNode(s,e); // 生成结点并插入链表
  48.        InsFirst(P,q,s);
  49.      }
  50.    }
  51.  }
  52.  void PrintPolyn(polynomial P)
  53.  { // 打印输出一元多项式P
  54.    Link q;
  55.    q=P.head->next; // q指向第1个结点
  56.    printf("  系数    指数/n");
  57.    while(q)
  58.    {
  59.      printf("%f  %d/n",q->data.coef,q->data.expn);
  60.      q=q->next;
  61.    }
  62.  }
  63.  void AddPolyn(polynomial &Pa,polynomial &Pb) // 算法2.23
  64.  { // 多项式加法:Pa=Pa+Pb,并销毁一元多项式Pb
  65.    Position ha,hb,qa,qb;
  66.    term a,b;
  67.    ha=GetHead(Pa);
  68.    hb=GetHead(Pb); // ha和hb分别指向Pa和Pb的头结点
  69.    qa=NextPos(ha);
  70.    qb=NextPos(hb); // qa和qb分别指向Pa和Pb中当前结点(现为第1个结点)
  71.    while(!ListEmpty(Pa)&&!ListEmpty(Pb)&&qa)
  72.    { // Pa和Pb均非空且ha没指向尾结点(qa!=0)
  73.      a=GetCurElem(qa);
  74.      b=GetCurElem(qb); // a和b为两表中当前比较元素
  75.      switch(cmp(a,b))
  76.      {
  77.        case -1:ha=qa; // 多项式Pa中当前结点的指数值小
  78.                qa=NextPos(ha); // ha和qa均向后移1个结点
  79.                break;
  80.        case 0: qa->data.coef+=qb->data.coef; // 两者的指数值相等,修改Pa当前结点的系数值
  81.                if(qa->data.coef==0) // 删除多项式Pa中当前结点
  82.                {
  83.                  DelFirst(Pa,ha,qa);
  84.          FreeNode(qa);
  85.                }
  86.                else
  87.                  ha=qa;
  88.                DelFirst(Pb,hb,qb);
  89.                FreeNode(qb);
  90.                qb=NextPos(hb);
  91.                qa=NextPos(ha);
  92.                break;
  93.        case 1: DelFirst(Pb,hb,qb); // 多项式Pb中当前结点的指数值小
  94.                InsFirst(Pa,ha,qb);
  95.                ha=ha->next;
  96.                qb=NextPos(hb);
  97.      }
  98.    }
  99.    if(!ListEmpty(Pb))
  100.    {
  101.      Pb.tail=hb;
  102.      Append(Pa,qb); // 链接Pb中剩余结点
  103.    }
  104.    DestroyPolyn(Pb); // 销毁Pb
  105.  }
  106.  void AddPolyn1(polynomial &Pa,polynomial &Pb)
  107.  { // 另一种多项式加法的算法:Pa=Pa+Pb,并销毁一元多项式Pb
  108.    Position qb;
  109.    term b;
  110.    qb=GetHead(Pb); // qb指向Pb的头结点
  111.    qb=qb->next; // qb指向Pb的第1个结点
  112.    while(qb)
  113.    {
  114.      b=GetCurElem(qb);
  115.      OrderInsertMerge(Pa,b,cmp);
  116.      qb=qb->next;
  117.    }
  118.    DestroyPolyn(Pb); // 销毁Pb
  119.  }
  120.  void Opposite(polynomial Pa)
  121.  { // 一元多项式Pa系数取反
  122.    Position p;
  123.    p=Pa.head;
  124.    while(p->next)
  125.    {
  126.      p=p->next;
  127.      p->data.coef*=-1;
  128.    }
  129.  }
  130.  void SubtractPolyn(polynomial &Pa,polynomial &Pb)
  131.  { // 多项式减法:Pa=Pa-Pb,并销毁一元多项式Pb
  132.    Opposite(Pb);
  133.    AddPolyn(Pa,Pb);
  134.  }
  135.  void MultiplyPolyn(polynomial &Pa,polynomial &Pb)
  136.  { // 多项式乘法:Pa=Pa×Pb,并销毁一元多项式Pb
  137.    polynomial Pc;
  138.    Position qa,qb;
  139.    term a,b,c;
  140.    InitList(Pc);
  141.    qa=GetHead(Pa);
  142.    qa=qa->next;
  143.    while(qa)
  144.    {
  145.      a=GetCurElem(qa);
  146.      qb=GetHead(Pb);
  147.      qb=qb->next;
  148.      while(qb)
  149.      {
  150.        b=GetCurElem(qb);
  151.        c.coef=a.coef*b.coef;
  152.        c.expn=a.expn+b.expn;
  153.        OrderInsertMerge(Pc,c,cmp);
  154.        qb=qb->next;
  155.      }
  156.      qa=qa->next;
  157.    }
  158.    DestroyPolyn(Pb); // 销毁Pb
  159.    ClearList(Pa); // 将Pa重置为空表
  160.    Pa.head=Pc.head;
  161.    Pa.tail=Pc.tail;
  162.    Pa.len=Pc.len;
  163.  }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值