题目:
一元稀疏多项式简单计算器的基本功能是:
1.输入并建立多项式;
2.输出多项式,输出形式为整数序列:n,c1,e1,,c2,e2 …… cn,en,其中 n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。
3.多项式a和b相加,建立多项式a+b
4.多项式a和b相减 ,建立多项式a-b
代码如下:
#include <iostream>
using namespace std;
typedef struct PNode
{
float coef; //系数
int expn; //指数
struct PNode *next;//指针域
}PNode,*PnodeList;
int InitList(PnodeList &L)
{
L=new PNode;
L->next=NULL;
return 0;
}
void Createlist(PnodeList &P,int n)
{
PnodeList s,pre,q;
for(int i=1;i<=n;++i) //依次输入n个非零项
{
s=new PNode;
cin>>s->coef>>s->expn;
pre=P; //用于保存q的前驱,初值为头结点
q=P->next; //q初始化指向首元结点
while(q&&q->expn>s->expn) //通过比较指数找到第一个小于输入项指数的项*q
{
pre=q;
q=q->next;
}
s->next=q; //将输入项s插入到q和其前驱结点pre之间
pre->next=s;
}
}
void Opertion(PnodeList &pa,PnodeList &pb)//多项式运算:加法pa=pa+pb
{
PnodeList p1,p2,p3,r;
int sum;
p1=pa->next;//p1,p2初值指向首元结点
p2=pb->next;
p3=pa; //p3指向和多项式当前结点,初值为pa
while(p1&&p2)
{
if(p1->expn==p2->expn)
{
sum=p1->coef+p2->coef;
if(sum!=0)
{
p1->coef=sum;//修改pa为两系数的和
p3->next=p1;p3=p1;//将修改后的pa当前结点链在p3之后,p3指向p1
p1=p1->next;
r=p2;p2=p2->next;delete r;//删除pb当前结点
}
else
{
r=p1;p1=p1->next;delete r;//删除当前结点,指向后一项
r=p2;p2=p2->next;delete r;
}
}
else if(p1->expn>p2->expn)
{
p3->next=p1; //将p1链在p3之后
p3=p1;
p1=p1->next;
}
else
{
p3->next=p2; //将p2链在p3之后
p3=p2;
p2=p2->next;
}
}
p3->next=p1?p1:p2; //插入非空多项式的剩余段
delete pb;
}
void Opertion1(PnodeList &pa,PnodeList &pb)//多项式运算:减法pa=pa-pb
{
PnodeList p1,p2,p3,r;
int sum;
p1=pa->next;//p1,p2初值指向首元结点
p2=pb->next;
p3=pa; //p3指向差多项式当前结点,初值为pa
while(p1&&p2)
{
if(p1->expn==p2->expn)
{
sum=p1->coef-p2->coef;
if(sum!=0)
{
p1->coef=sum;//修改pa为两系数的和
p3->next=p1;p3=p1;//将修改后的pa当前结点链在p3之后,p3指向p1
p1=p1->next;
r=p2;p2=p2->next;delete r;//删除pb当前结点
}
else
{
r=p1;p1=p1->next;delete r;//删除当前结点,指向后一项
r=p2;p2=p2->next;delete r;
}
}
else if(p1->expn>p2->expn)
{
p3->next=p1; //将p1链在p3之后
p3=p1;
p1=p1->next;
}
else
{
p2->coef=0-p2->coef;
p3->next=p2; //将p2链在p3之后
p3=p2;
p2=p2->next;
}
}
if(p3->next=p1) //插入非空多项式的剩余段
p3->next=p1;
else{
p3->next=p2;
while(p2)//第二段连上要变成负的
{
p2->coef=0-p2->coef;
p2=p2->next;
}
}
delete pb;
}
void outlist(PnodeList p)
{
PnodeList q;
int num=0;
q=p->next;
if(q==NULL)//判断链表是否为空
cout<<"0";
else{
while(q)
{
num++;
q=q->next;
}
cout<<num;
q=p->next;
while(q)
{
cout<<","<<q->coef<<","<<q->expn;
q=q->next;
}
}
}
int main()
{
PnodeList a,b;
InitList(a);
InitList(b);
int n1,n2;
cout<<"请输入pa表中的多项式项数:";
cin>>n1;
cout<<"请输入pa表的系数和指数:(格式:1 2)"<<endl;
Createlist(a,n1);
cout<<"请输入pb表中的多项式项数:";
cin>>n2;
cout<<"请输入pb表中的系数和指数:(格式:1 2)"<<endl;
Createlist(b,n2);
cout<<" --------------------------\n";
cout<<"| 请输入运算符:+或- |"<<endl;
cout<<" --------------------------"<<endl;
string m;
cin>>m;
if(m=="+")
{
Opertion(a,b);
cout<<"相加的结果为:";
outlist(a);
}
else if(m=="-")
{
Opertion1(a,b);
cout<<"相减的结果为:";
outlist(a);
}
else
cout<<"当前运算符不在操作范围内!!!";
return 0;
}