实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。
一、问题描述
一元多项式相加是通过键盘输入两个形如P
0+P
1
X1+P
2
X2+···+PnX n的多项式,经过程序运算后在屏幕上输出它
们的相加和。
二、数据结构设计
分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可将它抽象成一个由“系数—指数对”构成线性表,由于对多项式中系数为0的子项可以不记录他的数值,对于这样的情况就不再付出存储空间来存放它了。
基于这样的分析,可以采取一个带有头结点的单链表来表示一个一元多项式。
具体数据结构定义为:
typedef struct node
{
float ce; //系数域
float ex; //指数域
struct node *next; //指针域
}lnode,*linklist;
三功能(函数)设计
1、输入并建立多项式的功能模块
此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关的节点,当遇到输入结束标志时结束输入,而转去执行程序下面的部分。
屏幕提示:
input ce & ex and end with 0:
ce=1
ex=2
ce=0
ex=0 //输入结束标志
input ce & ex and end with 0:
ce=2
ex=2
ce=0
ex=0 //输入结束标志
输入后程序将分别建立两个链表来描述两个一元多项式:
A=X^2
B=2X^2
这两个多项式的相加的结果应该为:
C=3X^2
2、多项式相加的功能模块
此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。
可以采用以下方法进行设计:
开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。
if(a->ex==b->ex) //判断指数是否相等
{s->ce=a->ce+b->ce;
if(s->ce!=0)
s->ex=a->ex;
else delete s;
a=a->next;
b=b->next;
}
直到将所有的结点都处理一遍,得到合并之后的C式。
3、多项式显示的功能模块
此模块用于多项式的显示,程序可以使用文本界面,用“系数—指数对”的形式表达表达式,如:A=X^2+2X^3+3X^4+5X^6
B=2X^2+3X^3+5X^5+7X^9
C=3X^2+5X^3+3X^4+5X^5+5X^6+7X^9
四、界面设计
提示用户每一步输入操作的格式和限制。
指导用户按照正确的格式输入数据。
五、编码实现
见源程序。
六、运行与测试
1、测试以下数据,比较结果:
(1)(2x+5x8-3.1x11)+(7-5x8+11x9)=-3.1x11+11x9+2x+7
(2)(x+x3)+(-x-x3)=0
(3)(x+x2+x3)+0= x+x2+x3
2、指数递增的顺序输入多项式,验证程序的健壮性和容错性。
七、试验完成后的思考
1、通过本程序熟练掌握了应用链表处理问题的能力,增加了处理细节问题的经验,达到了实验目的。
2、通过在设计过程中的讨论和思考,对使用现有知识系统利用计算机来解决数学问题确立了信心,对链表的意义
有了更深刻的理解,为今后的程序设计奠定了一定的心理基础和技术上的准备。
3、由于个人能力实在有限,程序中还有一些需要完善的地方,例如,程序不能做出对数据类型的判断;没有一个
美观的图形界面;输入方式复杂,极易出错,等等等等。
在今后的试验中要多多联系这方面的能力。
附:程序源代码
#include<iostream>
using namespace std;
typedef struct node{
float ce;
int ex;
struct node *next;
}lnode,*linklist;
linklist creat()
{
linklist L;
lnode *s,*r;
float m;
int n;
L=r=NULL;
cout<<"input ce & ex end and with 0:"<<endl;
cout<<"ce=";
cin>>m;
cout<<"ex=";
cin>>n;
while(m&&n) //结束
{
s=new lnode;
s->ce=m;
s->ex=n;
if(L==NULL)
L=s;
else r->next=s;
r=s;
cout<<"ce=" ;
cin>>m;
cout<<"ex=" ;
cin>>n;
}
if(r!=NULL)
r->next=NULL;
return L;
} //初始化并赋值
linklist add(linklist A,linklist B)
{
linklist C;
lnode *s,*r,*a,*b;
a=A;
b=B;
C=r=NULL;
while(a&&b)
{
s=new lnode;
if(a->ex==b->ex) //判断指数是否相等
{
s->ce=a->ce+b->ce;
if(s->ce!=0)
s->ex=a->ex;
else delete s;
a=a->next;
b=b->next;
}
else{if(a->ex>b->ex) //a<b
{s->ce=b->ce;
s->ex=b->ex;
b=b->next;
}
else{s->ce=a->ce; //a>b
s->ex=a->ex;
a=a->next;
}
}
if(C==NULL)
C=s;
else r->next=s;
r=s;
}
while(a) //B结束
{ s=new lnode;
s->ce=a->ce;
s->ex=a->ex;
a=a->next;
if(C==NULL)
C=s;
else r->next=s;
r=s;
}
while(b)
{s=new lnode;
s->ce=b->ce;
s->ex=b->ex;
b=b->next;
if(C==NULL)
C=s;
else r->next=s;
r=s;
}
s=new lnode;
s->ce=0;
s->ex=0;
s->next=NULL;
if(r!=NULL)
r->next=NULL;
return C;
cout<<"ok"<<endl;
}
void print(linklist L)
{
lnode *p;
p=L;
if(p->ce==0&&p->ex==0)
cout<<0;
else
while(p!=NULL)
{
if(p->ce!=1&&p->ce!=-1) //ce?=1
cout<<p->ce<<"x";
else if(p->ce!=1)
cout<<"-x";
else
cout<<"x";
if(p->ex!=1)
cout<<"^"<<p->ex;
if(p->next&&p->next->ce>0)
cout<<"+";
p=p->next;
}
cout<<"ok"<<endl;
}
int main()
{
linklist A,B,C;
A=creat();
print(A);
B=creat();
print(B);
C=add(A,B);
cout<<"ok"<<endl;
print(C);
return 0;
}。