!求两个多项式相加运算

/*exp2-7.cpp*/
#include<stdio.h>
#include<malloc.h>
#define MAX 20/*多项式最多项数*/
typedef struct /*定义存放多项式的数组类型*/
{
 float coef;/*系数*/
 int exp;/*指数*/
}PolyArray[MAX];
typedef struct pnode/*定义单链表结点类型*/
{
 float coef;/*系数*/
 int exp;/*指数*/
 struct pnode *next;
}PolyNode;
void DispPoly(PolyNode *L)/*输出多项式*/
{
 PolyNode *p=L->next;
 while(p!=NULL)
 {
  printf("%gX^%d",p->coef,p->exp);
  p=p->next;
 }
 printf("\n");
}
void CreateListR(PolyNode * &L,PolyArray a,int n)/*尾插法建表*/
{
 PolyNode *s,*r;int i;
 L=(PolyNode *)malloc(sizeof(PolyNode));
 L->next=NULL;
 r=L;/*r始终指向终端结点,开始时指向头结点*/
 for(i=0;i<n;i++)
 {
  s=(PolyNode *)malloc(sizeof(PolyNode));/*创建新结点*/
  s->coef=a[i].coef;
  s->exp=a[i].exp;
  r->next=s;/*将*s插入到*r之后*/
  r=s;
 }
 r->next=NULL;/*终端结点next域置为NULL*/
}
void Sort(PolyNode * &head)/*按exp域递减排序*/
{
 PolyNode *p=head ->next,*q,*r;
 if(p!=NULL)/*若原链表中有一个以上的数据结点*/
 {
  r=p->next;
  p->next=NULL;/*构造只含一个数据结点的有序表*/
  p=r;
  while(p!=NULL)
  {
   r=p->next;
   q=head;
   while(q->next!=NULL && q->next->exp>p->exp)
    q=q->next;/*在有序表中找插入*p的前驱结点指针*/
   p->next=q->next;/*将*p插入到*q之后*/
   q->next=p;
   p=r;
  }
 }
}
void Add(PolyNode *ha,PolyNode *hb,PolyNode * &hc)/*求两有序集合的并*/
{
 PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
 float c;
 hc=(PolyNode *)malloc(sizeof(PolyNode));/*创建头结点*/
 tc=hc;
 while(pa!=NULL && pb!=NULL)
 {
  if(pa!=NULL && pb!=NULL)
  {
   s=(PolyNode *)malloc(sizeof(PolyNode));/*复制结点*/
   s->exp=pa->exp;s->coef=pa->coef;
   tc->next=s;tc=s;
   pa=pa->next;
  }
  else if(pa->exp<pb->exp)
  {
   s=(PolyNode *)malloc(sizeof(PolyNode));/*复制结点*/
   s->exp=pb->exp;s->coef=pb->coef;
   tc->next=s;tc=s;
   pb=pb->next;
  }
  else  /*pa->exp=pb->exp*/
  {
   c=pa->coef+pb->coef;
   if(c!=0)/*系数之和不为0时创建新结点*/
   {
    s=(PolyNode *)malloc(sizeof(PolyNode));/*复制结点*/
    s->exp=pa->exp;s->coef=c;
    tc->next=s;tc=s;
   }
   pa=pa->next;
   pb=pb->next;
  }
 }
  if(pb!=NULL)  pa=pb;/*复制余下的结点*/
  while(pa!=NULL)
  {
   s=(PolyNode *)malloc(sizeof(PolyNode));/*复制结点*/
   s->exp=pa->exp;s->coef=pa->coef;
   tc->next=s;tc=s;
   pa=pa->next;
  }
  tc->next=NULL;
}
void main()
{
 PolyNode *ha,*hb,*hc;
 PolyArray a={(1.2,0),(2.5,1),(3.2,3),(-2.5,5)};
 PolyArray b={(-1.2,0),(2.5,1),(3.2,3),(2.5,5),(5.4,10)};
 CreateListR(ha,a,4);
 CreateListR(hb,b,5);
 printf("原多项式A:");DispPoly(ha);
 printf("原多项式B:");DispPoly(hb);
 Sort(ha);
 Sort(hb);
 printf("有序多项式A:");DispPoly(ha);
 printf("有序多项式B:");DispPoly(hb);
 Add(ha,hb,hc);
 printf("多项式相加:");DispPoly(hc);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值