多项式加法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:多项式加法
多项式加法
一、课题概述
线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。现给两个一元整系数多项式,请求解两者之和。
输入
两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序,每一组结束行为0 -1。
输出
三组数据,前两组为一元整系数多项式,最后一组为两个多项式的和。
一元整系数多项式输出形式如下:
(1)多项式项4x输出为4X
(2)多项式项4x2输出为4X^2
(3)第一项系数为正数时,加号不要输出
(4)除常系数项外,项系数为1不显式输出,-1输出为-
例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为+4X^3-1X^2+1X-1
二、设计与实现
1、类的层次关系及核心算法分析:
项节点类Trem中定义了三个私有变量,系数coef、指数exp和指向下一个项节点的指针域link。多项式类Polynominal被声明成项节点类Trem类的友元类。公有函数InsertAfter构造一个新的项节点,其系数为c指数为e,并将新节点插入在调用该函数的项节点及后继节点之间。
多项式类Polynominal中包含了3个公有成员函数:AddTerms,Output和PolyAdd。AddTerms函数通过输入流in,输入多项式的各项构造一个多项式的单循环链表;Output函数将多项式按降幂方式送输出流;PolyAdd函数实现将多项式r加到指针this指示的多项式上。AddTerms函数从输入流in按降幂输入各项(c,e)来构造多项式的单循环链表,当输入(0,-1)是构造过程结束。Output函数遍历单循环链表将多项式按降幂方式送输出流,它调用项类Trem 上重载的“<<”操作符实现按项输出。
多项式加法,设有多项式p(x)和q(x),分别用单循环链表表示。
设p和q分别指向多项式p(x)和q(x)的当前正进行比较的项节点,初始时分别指向两多项式中最高幂次的项节点。q 1指向q的前驱节点。对p(x)进行遍历。直到处理完所有节点。当p->exp
2、关键函数流程图:
○
1多项式创建流程图: N Y
○
2多项式加法流程图: ○3Output 函数流程图:
N
Y
N Y
Y
N Y 开始
创建链表类型的 项 按降幂依次输入各项的系数和指数
输入“0 -1”
一元
多项式创建成功
开始 跳过系数大的项
指数相等
系数相加
系数为0 删除p,重置q 指针。 以p 的系数和指数生成新节点,
插入q1后.
移动q1和q
指数大于等于0
开始
遍历单循环链表,统计统计单循环链表有几项(k ),统计单循环链表前几项(i)为0。
如果只有一项,并且为系数为0,则输出一个0。
如果全为0,则输出一个0。
再遍历一次单循环链表,找到第一个不为0的节点,并把系数输出,不管正负号。 从第一个不为0的节点之后的节点开始遍历单循环链表。
系数>0
输出一个“+"
out<<*m
输出该项 结束
3、源代码:
#include
using namespace std;
class Polynominal; //向前引用,因为后面定义的Trem类中用到Polynominal类
class Term //定义项节点类Trem
{
public:
Term(int c,int e);
Term(int c,int e,Term *nxt);
Term* InsertAfter(int c,int e); //在this指针指示的节点后插入新节点
private:
int coef; //系数
int exp; //指数
Term *link;
friend ostream & operator<<(ostream &,const Term &); //重载”<<“,输出多项式的一项
friend class Polynominal; //类Polynominal作为类Term的友元类
};
Term::Term(int c,int e):coef(c),exp(e)
{
link=0;
}
Term::Term(int c,int e,Term *nxt):coef(c),exp(e)
{
link=nxt;
}
Term* Term::InsertAfter(int c,int e)//为新项申请节点的存储单元,并用Term函数将c,e和this->link 的值填入新节点的相应域
{
link=new Term(c,e,link);
return link;
}
ostream & operator<<(ostream & out,const Term & val)//重载”<<",输出多项式的一项,用coef X^exp 表示多项式的每一项
{
if(val.coef==0) return out; //如果系数为0,直接跳出
if(val.coef==1) //如果系数为1 ,再判断
{
switch (val.exp)
{
case 0:out<<1;break; //如果在系数为1的前提下,指数为0,则输出“1"
case 1:out<<"X"; break; //如果在系数为1的前提下,指数为1,则输出"X"
default:out<<"X^"< }