一元稀疏多项式加法运算.docx
《一元稀疏多项式加法运算.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式加法运算.docx(10页珍藏版)》请在冰豆网上搜索。
一元稀疏多项式加法运算
一元稀疏多项式加法运算
一、需求分析
1.程序的功能
设计一个简单的一元稀疏多项式加法运算器。
一元稀疏多项式简单计算器的基本功能包括:
(1).按照指数升序次序,输入并建立多项式A与B。
(2).计算多项式A与B的和,即建立多项式A+B。
(3).按照指数升序次序,输出多项式A、B、A+B。
2.输入输出的要求
输入多项式时可以按任意次序输入各项的数据,不必按指数有序;在算法中实现建立按指数有序的多项式。
多项式的输出形式采用图形界面,通过调整指数应该出现的坐标位置来表示指数形式,如X+2X2-3X100的形式。
3.测试数据
(1).(x+3x6-8.6x11)+(6-3x6+21x9)=6+x+21x9-8.6x11
(2).(3x-3-x+4.1x2-1.2x9)+(―3x―3-5.1x2+7.8x12)=-x-x2-1.2x9+7.8x12
(3).(x+x3)+(―x―x3)=0
(4).(x+x100)+(x100+x200)=(x+2x100+x200)
(5).(x+x2+x3)+0=x+x2+x3
二、概要设计
1.输入多项式,建立多项式链表
首先创建带头结点的单链表;然后按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项:
“系数、指数对”,每输入一个子项就建立一个结点,并将其插入到多项式链表的表尾,如此重复,直至遇到输入结束标志的时候停止,最后生成按指数递增有序的链表。
2.多项式相加
多项式加法规则:
对于两个多项式中指数相同的子项,其系数相加,若系数的和非零,则构成“和多项式”中的一项;对于指数不同的项,直接构成“和多项式”中的一项。
3.多项式的输出
可以在文本界面下,采用类似于数学表达式的方式输出多项式,如多项式A可显示为:
A=3+6X∧3-2X∧8+12X∧20
3、详细设计
1. 数据类型定义可描述如下:
typedefstructpnode
{
float coef; /*系数域*/
int exp; /*指数域*/
structpnode *next; /*指针域,指向下一个系数不为的子项*/
}PolyNode,*PolyLink;
PolyLink A,B,C; /*单链表存储的多项式A、B、C*/
2.输入多项式,建立多项式链表
首先创建带头结点的单链表;然后按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项:
“系数、指数对”,必须按照升序输入,每输入一个子项就建立一个结点,并将其插入到多项式链表的表尾,如此重复,直至遇到输入结束标志的时候停止,最后生成按指数递增有序的链表。
PolyNode*createList(PolyNode*p) //建立多项式链表
{
floatm;
intn;
p=newPolyNode; //申请空间
PolyNode*newNode;
PolyNode*preNode=p;
if(p==NULL)
{
cout<<"内存分配失败!
"<returnNULL;
}
else
{
p->next=NULL;
cin>>m>>n;
while(m!
=0||n!
=0)
{
if(m!
=0)
{
newNode=newPolyNode; //为新结点申请内存
if(newNode==NULL)
{
cout<<"内存分配失败!
"<returnp;
}
newNode->coef=m;
newNode->exp=n;
preNode->next=newNode;
preNode=newNode;
}
cin>>m>>n;
}
newNode->next=NULL;
}
returnp;
}
3.多项式相加
多项式加法规则:
对于两个多项式中指数相同的子项,其系数相加,若系数的和非零,则构成“和多项式”中的一项;对于指数不同的项,直接构成“和多项式”中的一项。
将
(1)中单链表表示的两个多项式A和B相加,运算的结果是利用原表空间生成一个新链表,表示和多项式C。
运算规则如下:
设指针pa、pb分别指向多项式链表A、B的第一个结点,比较pa、pb所指两结点中的指数项:
①若pa->expexp,则将pa所指结点插入到“和多项式”链表中去;
②若pa->exp>pb->exp,则将pb所指结点插入到“和多项式”链表中去;
③若pa->exp==pb->exp,则计算系数和pa->coef+pb->coef,若和非零,插入到“和多项式”链表中去,删除pb所指结点;否则删除pa、pb所指结点。
继续比较下一项,重复上述过程,直至A、B中某一链表结束,此时将非空链表中剩余的结点出入到“和多项式”链表即可。
PolyNode*plus(PolyNode*P,PolyNode*Q) //两个多项式相加
{
PolyNode*p,*q,*s,*r;
p=P->next;
q=Q->next;
C=P;
r=C;
deleteQ;
while(p&&q)
{
if(p->exp==q->exp) //指数相同时,对应项系数相加
{
p->coef=p->coef+q->coef;
s=p;
p=p->next;
q=q->next;
}
elseif(p->expexp)
{
s=p;
p=p->next;
}
else
{
s=q;
q=q->next;
}
if(s->coef!
=0)
{
r->next=s;
r=s;
}
}
if(p==NULL)
p=q;
while(p)
{
s=p;
p=p->next;
r->next=s;
r=s;
}
r->next=NULL;
returnC;
} 4.多项式的输出
可以在文本界面下,采用类似于数学表达式的方式输出多项式,如多项式A可显示为:
A=3+6X∧3-2X∧8+12X∧20
需要注意:
系数值为1的非零次项的输出形式中略去系数1,如子项1x8的输出形式为x8,项-1x3的输出形式为-x3。
多项式的第一项的系数符号为正时,不输出“+”,其它项要输出“+”、“-”符号。
voidprint(PolyNode*L) //输出多项式。
{
PolyNode*p;
p=L->next;
if(p==NULL)
{
cout<<"0"<return;
}
if(p->exp==0) //指数为零时,输出第一项系数
cout<coef;
else
{ //指数不为零,分情况输出系数
if(p->coef==-1)
cout<<'-';
elseif(p->coef!
=1)
cout<coef;
cout<<'X';
if(p->exp>0&&p->exp!
=1)
cout<<'^'<exp;
elseif(p->exp<0)
cout<<"^("<exp<<")";
}
p=p->next;
while(p)
{
if(p->exp==0)
{
if(p->coef>0)
cout<<"+"<coef;
else
cout<coef;
}
else
{
if(p->coef==-1)
cout<<'-';
elseif(p->coef==1)
cout<<'+';
elseif(p->coef>0)
cout<<'+'<coef;
elseif(p->coef<0)
cout<coef;
cout<<'X';
if(p->exp>0&&p->exp!
=1)
cout<<'^'<exp;
elseif(p->exp<0)
cout<<"^("<exp<<")";
}
p=p->next;
}
}
4、调试分析
在该程序设计中,由于开始时对算法的不熟悉,而且对链表的认识不深,在写程序的时候经常不知道如何建立和连接指针链表,所以耗费了很长时间在学习编写链表。
在这次作业中主要运用抽象数据定义的设计方法,确实让我受益匪浅,在实际编程中,学到了很多知识。
5、测试结果
输入两个多项式,进行和的运算。
(1).(x+3x6-8.6x11)+(6-3x6+21x9)=6+x+21x9-8.6x11
(2).(3x-3-x+4.1x2-1.2x9)+(―3x―3-5.1x2+7.8x12)=-x-x2-1.2x9+7.8x12
(3).(x+x3)+(―x―x3)=0
(4).(x+x100)+(x100+x200)=(x+2x100+x200)
//jiajia.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
#include
#include
usingnamespacestd;
typedefstructpnode
{
float coef; /*系数域*/
int exp; /*指数域*/
structpnode *next; /*指针域,指向下一个系数不为的子项*/
}PolyNode,*PolyLink;
PolyLink A,B,C; /*单链表存储的多项式A、B、C*/
PolyNode*createList(PolyNode*p); //建立多项式链表
PolyNode*plus(PolyNode*P,PolyNode*Q); //两个多项式相加
voidprint(PolyLinkp); //输出多项式
int_tmain(intargc,_TCHAR*argv[])