题目二:多项式的表示及相加
[问题描述]
设计一个算法,以实现一元稀疏多项式的加法运算。
[基本要求]
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b。
[源代码]
#include<stdio.h>
#include<iostream>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int Boolean;
typedef int ElemType;
typedef struct PNode{
float coef; //系数
int expn; //指数
struct PNode *next; //指针域
}PNode,*Polynomial;
void CreatPolyn(Polynomial &P,int n)
{//输入n项的系数和指数,建立表示多项式的有序链表P
Polynomial s,q,pre;
P=new PNode;
P->next=NULL; //先建立一个带头结点的单链表
for(int i=1;i<=n;i++){ //依次输入n个非零项
s=new PNode; //生成新结点
cin>>s->coef>>s->expn; //输入系数和指数
pre=P; //pre用于保存q的前驱,初值为头结点
q=P->next; //q初始化,指向首元结点
while(q&&q->expn<s->expn){//通过比较指数找到第一个大于输入项指数的项*q
pre=q;
q=q->next;
}
s->next=q; //将数额u项s插入到q和其前驱结点pre之间
pre->next=s;
}
}
void AddPolyn(Polynomial &Pa,Polynomial &Pb)
{//多项式加法:Pa=Pa+Pb,利用两个多项式的节点构成“和多项式”
Polynomial p1,p2,p3,r,p;
float sum;
p1=Pa->next;p2=Pb->next; //p1和p2初值分别指向Pa和Pb的首首元结点
p3=Pa; //p3指向和多项式的当前结点,初值为Pa
while(p1&&p2)
{
if(p1->expn==p2->coef) //指数相等
{
sum=p1->coef+p2->coef; //sum保存两项系数的和
if(sum!=0) //系数和不为0
{
p1->coef=sum; //修改Pa当前结点的系数值为两项系数的和
p3->next=p1;p3=p1; //将修改后的Pa当前结点链在p3之后,p3指向p1
p1=p1->next; //p1指向后一项
r=p2;p2=p2->next;delete r;//删除Pb当前结点,p2指向后一项
}
else{ //系数和为0
r=p1;p1=p1->next;delete r;//删除Pa当前结点,p1指向后一项
r=p2;p2=p2->next;delete r;//删除Pb当前结点,p2指向后一项
}
}
else if(p1->expn<p2->expn) //Pa当前结点的指数值小
{
p3->next=p1; //将p1链在p3之后
p3=p1; //p3指向p1
p1=p1->next; //p1指向后一项
}
else{ //Pb当前结点的指数值小
p3->next=p2; //将p2链在p3之后
p3=p2; //p3指向p2
p2=p2->next; //p2指向后一项
}
}
p3->next=p1?p1:p2; //插入非空多项式的剩余段
delete Pb; //释放Pb的头结点
}
void printPolynomial(Polynomial P){//打印多项式链表
Polynomial q=P->next;
printf("打印求和多项式的线性表:");
while(q){
printf("(%.2f,%d) ",q->coef,q->expn);//输出小数点后2位的多项式系数及指数
q=q->next; //q指向后一项
}
printf("\n\n");
}
int main()
{
Polynomial Pa,Pb;
int n;
cout<<"输入多项式的项数:";
cin>>n;
cout<<"输入第一个多项式:";
CreatPolyn(Pa,n);
cout<<"输入第二个多项式:";
CreatPolyn(Pb,n);
AddPolyn(Pa,Pb);
printPolynomial(Pa);
return 0;
}
[测试数据]