收藏 分享(赏)

实验一_一元稀疏多项式的表示及加法运算.doc

上传人:jinchen 文档编号:6367816 上传时间:2019-04-09 格式:DOC 页数:14 大小:305KB
下载 相关 举报
实验一_一元稀疏多项式的表示及加法运算.doc_第1页
第1页 / 共14页
实验一_一元稀疏多项式的表示及加法运算.doc_第2页
第2页 / 共14页
实验一_一元稀疏多项式的表示及加法运算.doc_第3页
第3页 / 共14页
实验一_一元稀疏多项式的表示及加法运算.doc_第4页
第4页 / 共14页
实验一_一元稀疏多项式的表示及加法运算.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、实验一 一元稀疏多项式的表示及加法运算一、 需求分析1. 程序的功能: 多项式以指数递增的顺序输入。 设计的数据结构应有利于表示任意一元稀释多项式。 输出原始多项式及运算结果。 附加功能:乱序输入计算表达式结果2. 输入输出要求: 多项式以指数递增的方式输入 输出原始多项式及其结果3. 测试数据(1) , 1785937x87928xx(2)0 , 92(3) , -187108xx附加功能测试数据:(4) ,5365226x二、 概要设计 所用数据结构定义:struct Term /多项式结点的定义float coef; /系数int exp; /指数Term * link;Term(flo

2、at c,int e,Term * next=NULL)coef=c;exp=e;link=next;Term *InsertAfter(float c,int e);Term return *this;Term return *this;friend ostream /必须链成环Polynomal()makeEmpty();Polynomal(Polynomal /复制构造函数Polynomal /重载复制赋值操作符void insert(float c,int e,Polynomal/对于二项式进行插入排序Polynomal sort();/对于多项式进行排序Term * getHead(

3、) constreturn first;void makeEmpty();private:Term * first;friend ostream friend Polynomal operator+(Polynomal; 主程序的流程及各模块之间的层次关系:1) 主程序流程程序运行输入第一个多项式f ( x )提示分别输入系数 、 指数系数 、 指数是否为0 、 - 1键入 E n t e r 表示输入一组系数 、 指数输入第一个多项式g ( x )提示分别输入系数 、 指数键入 E n t e r 表示输入一组系数 、 指数系数 、 指数是否为0 、 - 1结束YNN对输入表达式进行升幂排列

4、Y输出排序完成的表达式 , 以及计算结果2) 模块之间层次关系重载 o p e r a t o r +插入 I n s e r t A f t e rm a i n 函数重载 o p e r a t o r 重载 o p e r a t o r =调用调用 s o r t 函数进行多项式排列三、 详细设计1、插入一个结点Term* Term:InsertAfter(float c,int e)/在当前由this指针指示的项(即调用此函数的对象)后面插入一个新项link=new Term(c,e,link); /创建一个新结点,自动链接return link; /插入到this结点后面2、重载各

5、运算符(1)Polynomal /先清空first=new Term(0,-1);Term *destptr=first,*srcptr=R.first-link;while(srcptr!=R.first)destptr-InsertAfter(srcptr-coef,srcptr-exp);srcptr=srcptr-link;destptr=destptr-link;destptr-link=first; /必须链成环return *this;#伪代码清空;动态创建节点first;创建节点指针*destptr指向first,创建节点指针*srcptr指向R.first-link;WHIL

6、E(R链未遍历结束)将R链表中的结点一次插入到first之后;ENDWHILE将*destptr连成环;结束(2)istreamint e;float c; /定义尾指针rearwhile(1)coutce;if(c=0 /用e小于控制输入结束rear=rear-InsertAfter(c,e); /链接到rear所指结点后return in;(3)ostream coutcoef0.0)outcoef=0)outlink;elseoutlink;outlink;设置标志位hWHILEIF打印符号+;改变标志位;ELSE打印该节点;指向下一个节点;ENDIFENDWHILE(4)Polynom

7、al operator+(Polynomalfloat temp;Polynomal C;pc=C.first;pa=A.first-link;pb=B.first-link;while(pa!=A.first /系数相加if(fabs(temp)!=0)pc=pc-InsertAfter(temp,pa-exp);pa=pa-link ;pb=pb-link;else if(pa-expexp)pc=pc-InsertAfter(pa-coef,pa-exp); /pa指数小 pa=pa-link;elsepc=pc-InsertAfter (pb-coef,pb-exp);pb=pb-li

8、nk; /pb指数小,加入ah链if(pa!=A.first)p=pa;last=A.first;elsep=pb;last=B.first;while(p!=last)pc=pc-InsertAfter (p-coef,p-exp );p=p-link;return C;#伪代码*Pa=二项式a的当前节点;*pb=二项式b的当前节点;新建二项式c;WHILEIFIF系数相加后将插入节点到c尾部;ENDIF比较a,b的下一个节点ELSEIF将pa的当前节点复制到c尾部;Pa后移;ELSE将Pb的当前节点复制到c尾部;Pb后移;ENDIFENDWHILEIF将未遍历空的那一个所在的二项式剩余部分

9、复制到c尾部;ENDIF返回合成多项式3、排序算法(1)Polynomal Polynomal:sort()Polynomal R;Term *p=first;p=p-link;while(p!=first)insert(p-coef,p-exp,R);p=p-link;return R;(2)void Polynomal:insert(float c, int e, Polynomal if(p=R.first) q-link=new Term(c,e);/c为空q-link-link=R.first;elsewhile(p!=R.first)if(p-exp=e)/指数相等p-coef+=

10、c;if(p-coef!=0)break;if(p-coef=0)q-link=p-link;r=p;p=p-link;delete r;break;else if(p-expe)/e小于当前结点的指数q-link=new Term(c,e);q=q-link;q-link=p;break;elsep=p-link;q=q-link;if (p=R.first) /e大于R中每一项的指数,插在表尾q-link=new Term(c,e);q-link-link=p;四、 调试分析1、调试中的问题(1)在测试数据一时,出现带有常数项的多项式,常数项被构造为一次项,例如多项式 被输出为178593

11、7x178593xx解决办法:在重载运算符+中,当pa的指数小时,将程序由pc=pc-InsertAfter (pa-coef,pb-exp);pb=pb-link;改为pc=pc-InsertAfter (pb-coef,pb-exp);pb=pb-link;即可;(2)在调试问题二的过程中,出现的0被程序自动忽略,不能打印使得输出结果为 87928xx解决办法:在重载输出运算符的程序模块中添加:if(current-coef=0)outlink;即可保证程序的输出正常,但是是以 作为输出的。879280xx(3)由于程序的数据结构构造成一种环形链表,因而在编程侧时候比单链表更易出错,采取画

12、图的方式容易解决问题。2、分析算法的时间复杂度和空间复杂度本实验所涉及算法基本采用顺序遍历方式,因而时间复杂度为o(m+n),空间复杂度为o(m+n)。五、 使用说明及测试结果按照程序提示,依次输入多项式的各项,系数与指数以Enter隔开,整个多项式输入以0、-1结束。如下图所示:1、测试数据一2、测试数据二3、测试数据三4、测试数据四六、 源程序带注释#include#includeusing namespace std;struct Term /多项式结点的定义float coef; /系数int exp; /指数Term * link;Term(float c,int e,Term *

13、next=NULL)coef=c;exp=e;link=next;Term *InsertAfter(float c,int e);Term return *this;Term return *this;friend ostream /必须链成环Polynomal()makeEmpty();Polynomal(Polynomal /复制构造函数Polynomal /重载复制赋值操作符void insert(float c,int e,Polynomal/对于二项式进行插入排序Polynomal sort();/对于多项式进行排序Term * getHead() constreturn firs

14、t;void makeEmpty();private:Term * first;friend ostream friend Polynomal operator+(Polynomal;Term* Term:InsertAfter(float c,int e)/在当前由this指针指示的项(即调用此函数的对象)后面插入一个新项link=new Term(c,e,link); /创建一个新结点,自动链接return link; /插入到this结点后面ostreamif(p=R.first) q-link=new Term(c,e);/c为空q-link-link=R.first;elsewhil

15、e(p!=R.first)if(p-exp=e)/指数相等p-coef+=c;if(p-coef!=0)break;if(p-coef=0)q-link=p-link;r=p;p=p-link;delete r;break;else if(p-expe)/e小于当前结点的指数q-link=new Term(c,e);q=q-link;q-link=p;break;elsep=p-link;q=q-link;if (p=R.first) /e大于R中每一项的指数,插在表尾q-link=new Term(c,e);q-link-link=p;Polynomal Polynomal:sort()Po

16、lynomal R;Term *p=first;p=p-link;while(p!=first)insert(p-coef,p-exp,R);p=p-link;return R;Polynomal:Polynomal(PolynomalTerm *destptr=first,*srcptr=R.first-link;while(srcptr!=R.first)destptr-InsertAfter(srcptr-coef,srcptr-exp);/在destptr所指结点后插入一新结点,再让destptr指到这个新结点srcptr=srcptr-link;destptr=destptr-lin

17、k;destptr-link=first; /必须链成环Polynomal /先清空first=new Term(0,-1);Term *destptr=first,*srcptr=R.first-link;while(srcptr!=R.first)destptr-InsertAfter(srcptr-coef,srcptr-exp);srcptr=srcptr-link;destptr=destptr-link;destptr-link=first; /必须链成环return *this;void Polynomal:makeEmpty()Term *q;while(first-link!

18、=first)q=first-link;first-link=q-link;delete q;istreamint e;float c; /定义尾指针rearwhile(1)coutce;if(c=0 /用e小于控制输入结束rear=rear-InsertAfter(c,e); /链接到rear所指结点后return in;ostream coutcoef0.0)outcoef=0)outlink;elseoutlink;outlink;pb=B.first-link;while(pa!=A.first /系数相加if(fabs(temp)!=0)pc=pc-InsertAfter(temp,

19、pa-exp);pa=pa-link ;pb=pb-link;else if(pa-expexp)pc=pc-InsertAfter(pa-coef,pa-exp); /pa指数小 pa=pa-link;elsepc=pc-InsertAfter (pb-coef,pb-exp);pb=pb-link; /pb指数小,加入ah链if(pa!=A.first)p=pa;last=A.first;elsep=pb;last=B.first;while(p!=last)pc=pc-InsertAfter (p-coef,p-exp );p=p-link;return C;int main()Polynomal A,B;coutA;coutB;cout“进行插入排序后的多项式“endl;Polynomal A1=A.sort();Polynomal B1=B.sort();Polynomal C(A1); /将A1赋值给Ccout“f(x)=“A1endl;cout“g(x)=“B1endl;cout“C按f(x)构造后得到:C=“Cendl;C=A1+B1;cout“C=f(x)+g(x)“Cendl;return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 中学实验

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报