【问题描述】
设计一个一元稀疏多项式简单计算器。
【基本要求】
一元稀疏多项式简单计算器的基本功能是:
- 输入并建立多项式;
- 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数降序排列;
- 多项式a和b相加,建立多项式a+b;
【测试数据】
- (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7);
- (1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5);
- (x+x3)+(-x-x3)=0;
- (x+x100)+(x100+x200)=(x+2x100+x200);
- (x+x2+x3)+0=(x+x2+x3);
- 互换上述测试数据中的前后两个多项式。
代码:
#include<bits/stdc++.h>
using namespace std;
#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) //输出多项式
{
int i=0;
PolyNode *p=L->next;
while (p!=NULL)
{
if(p->coef>0 && i!=0)
cout << "+";
if(p->coef!=0)
{
if(p->coef==1)
{
if(p->exp==0)
cout << 1;
else if(p->exp==1)
cout << "x";
else
printf("x^%d",p->exp);
}
if(p->coef!=1)
{
if(p->exp==0)
printf("%g",p->coef);
else if(p->exp==1)
printf("%gx",p->coef);
else
printf("%gx^%d",p->coef,p->exp);
}
}
p=p->next;
i++;
}
if(i==0)
cout << 0;
cout << endl;
}
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;//r保存*p结点后继结点的指针
p->next=NULL;//构造只含一个数据结点的有序表
p=r;
while(p!=NULL)
{
r=p->next;//r保存*p结点后继结点的指针
q=head;
while(q->next!=NULL && q->next->exp>p->exp)
q=q->next;//在有序表中找插入*p的前驱结点*q
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->exp>pb->exp)
{
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
{
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;
}
int main()
{
PolyNode *ha,*hb,*hc;
int m,n;
PolyArray a,b;
cin>>m;
for(int i=0;i<m;i++)
scanf("%g%d",&a[i].coef,&a[i].exp);
cin>>n;
for(int j=0;j<n;j++)
scanf("%g%d",&b[j].coef,&b[j].exp);
CreateListR(ha,a,m);
CreateListR(hb,b,n);
Sort(ha);
Sort(hb);
Add(ha,hb,hc);
DispPoly(hc);
return 0;
}