一元多项式求和问题的研究与实现

合集下载

一元多项式相加问题的实验报告

一元多项式相加问题的实验报告
struct node
{
ﻩfloatcoef; //系数域
intexp;//指数域
structnode*next;
};
三、功能函数设计
1、输入多项式的系数和指数初始化多项式的功能模块
具体函数为node *in_fun()
此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项,输入一个子项建立一个相关结点,当遇到输入结束标志时停止输入。关键步骤具体如下:
if(q!=NULL)q->next=NULL;
ﻩreturna;
⑷动态分配空间新建结点存储系数和指数的代码如下:
p=new node;
ﻩp->coef=x;
ﻩp->exp=y;
ﻩﻩif(a==NULL)a=p;
ﻩelseq->next=p;
ﻩﻩq=p;
2、多项式显示功能函数
由于系数有正有负,故采取如下处理:
二、数据结构设计
一个一元多项式的每一个子项都由“系数-指数”两部分组成,因此可将其抽象为包含系数coef、指数exp、指针域next构成的链式线性表。将两个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的移动来构成新的线性表,期间可以将某些不需要的空间回收。基于这样的分析,可以采用不带头结点的单链表来表示一个一元多项式。具体数据类型定义为:
ﻩif(p!=NULL)
{
ﻩﻩwhile(p)
{
w=p;
p=p->next;
ﻩﻩﻩr->next=w;
ﻩﻩr=w;
}
ﻩ}
if(q!=NULL)
{
ﻩﻩwhile(q)

一元多项式的求和运算

一元多项式的求和运算

一元多项式的求和运算一元多项式的求和运算是代数学中的重要概念,它涉及到多项式的基本运算和代数方程的求解。

在本文中,我们将全面介绍一元多项式的求和运算,并提供一些指导意义。

一元多项式是由若干项组成的,每一项包含一个常数乘以一个变量的幂。

例如,多项式f(x) = 3x^2 + 2x + 1就是一个一元多项式,其中包含了三个项:3x^2、2x和1。

求和运算即将多项式中的所有项相加,得到一个结果。

求和运算过程中,首先需要将多项式按照指数从高到低排列。

这样做的目的是方便相同指数的项合并,从而简化求和的过程。

例如,对于多项式f(x) = 3x^2 + 2x + 1,按照指数从高到低排列后,变为f(x) = 3x^2 + 2x + 1。

接下来,我们将相同指数的项合并。

在本例中,没有相同指数的项,所以不需要合并。

最后,将所有项相加,得到最终结果。

除了将相同指数的项合并外,求和运算还可以应用于求解代数方程。

当我们需要找到使得多项式等于零的变量值时,可以通过求和运算得到该变量的解。

例如,若要求解方程f(x) = 0,可以将多项式按照指数从高到低排列,并将所有项相加。

若最终结果为0,即表明该变量的某个值满足方程。

一元多项式的求和运算在数学和科学中有广泛的应用。

在代数学中,基于求和运算的多项式求解技术被广泛应用于方程求解、多项式插值和最小二乘拟合等问题中。

在物理学中,一元多项式的求和运算用于描述物理量之间的关系,如牛顿运动定律、电路分析和热力学方程等。

在经济学和金融学中,多项式的求和运算用于建模和预测经济变量,如股票价格、利率和通货膨胀率等。

通过一元多项式的求和运算,我们可以更好地理解多项式的性质和特点,从而应用于实际问题的求解。

同时,求和运算也是培养数学思维和解决实际问题的重要途径之一。

通过合理运用多项式的求和运算,我们可以化繁为简,解决复杂的问题。

综上所述,一元多项式的求和运算是代数学中的重要概念,它不仅包括多项式的基本运算和代数方程的求解,还具有广泛的应用。

一元多项式的求和

一元多项式的求和

一元多项式的求和一元多项式的求和是数学中常见的问题,它涉及到对一元多项式中的各项进行求和运算,是代数学中的重要概念之一。

本文将介绍一元多项式的求和的基本概念、方法和应用。

一元多项式是指仅含有一个未知数的多项式,它由若干个单项式相加或相减而成。

每个单项式由系数和次数两部分组成,其中系数可以是实数、复数或其他数域中的元素,次数为非负整数。

一元多项式的一般形式可以表示为:P(x) = a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0其中,P(x)表示一元多项式,a_n, a_{n-1}, ..., a_1, a_0为系数,x为未知数,n为最高次数。

一元多项式的求和即是对多项式中各项的系数进行求和运算。

具体来说,就是将各项的系数相加得到一个结果。

例如,对于一元多项式:P(x) = 2x^3 - 5x^2 + 3x - 1我们可以将其系数相加得到求和结果为:2 + (-5) +3 + (-1) = -1这就是该一元多项式的求和结果。

对于一元多项式的求和,可以应用代数学中的求和公式或方法进行计算。

常见的求和方法包括直接相加法、分组求和法和利用求和公式法。

直接相加法是最简单直观的求和方法,即将各项的系数直接相加。

这种方法适用于项数较少或系数较简单的一元多项式。

例如,对于一元多项式:P(x) = 2x^3 - 5x^2 + 3x - 1我们可以直接相加得到求和结果为:2 + (-5) +3 + (-1) = -1分组求和法是将一元多项式中的各项按照次数进行分组,然后对每组的系数进行求和。

这种方法适用于项数较多或系数较复杂的一元多项式。

例如,对于一元多项式:P(x) = 2x^3 - 5x^2 + 3x - 1我们可以按次数分组得到:2x^3 + (-5x^2) + 3x + (-1)然后对每组的系数进行求和,得到求和结果为:2 + (-5) +3 + (-1) = -1利用求和公式法是根据一元多项式的特点,利用求和公式进行计算。

一元多项式相加问题实验报告

一元多项式相加问题实验报告

一元多项式相加问题实验报告一元多项式相加问题一、问题描述通过键盘输入两个形如P 0 +P 1 X 1 +P 2 X 2 +…+P n X 的多项式,经过程序运后在屏幕上输出它们的相加和。

二、数据结构设计一个一元多项式的每一个子项都由“系数-指数”两部分组成,因此可将其抽象为包含系数coef、指数exp、指针域next 构成的链式线性表。

将两个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的移动来构成新的线性表,期间可以将某些不需要的空间回收。

基于这样的分析,可以采用不带头结点的单链表来表示一个一元多项式。

具体数据类型定义为:struct node {float coef;//系数域int exp;//指数域struct node *next; }; 三、功能函数设计1、输入多项式的系数和指数初始化多项式的功能模块具体函数为node *in_fun() 此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输入各个系数不为0 的子项,输入一个子项建立一个相关结点,当遇到输入结束标志时停止输入。

关键步骤具体如下:⑴控制用户按照指数递增的顺序输入r=a; while(r!=q-next){if(y=r-exp){cout“请按照指数递增顺序输入,请重新输入“;cinxy;break;}r=r-next;} 从头开始遍历,若遇到目前输入的指数不是最大时,就跳出循环,让用户重新输入。

⑵当输入的系数为零时,不为其分配存储空间存储while(x==0) { cinxy; continue;} 即若系数为0,不再进行动态分配并新建结点,而是重新提取用户输入的下一个子项的系数和指数,利用continue 进入下一次循环。

⑶初始化完成后将最后一个结点的指针域置为空,并返回该新建链表的首地址。

if(q!=NULL)q-next=NULL;return a; ⑷动态分配空间新建结点存储系数和指数的代码如下:p=new node;p-coef=x;p-exp=y;if(a==NULL) a=p;else q-next=p;q=p; 2、多项式显示功能函数由于系数有正有负,故采取如下处理:对于正数,输出时在前面加“+”,头指针除外;对于负数,直接将系数输出即可,即:p=a;while(p){if(p==a)coutp-coef"*x^"p-else if(p-coef0)coutp-coef"*x^"p-else if(p-coef0)cout"+"p-coef"*x^"p-p=p-next;} 输出的多项式的形式形如:P 1 X^1+P 2 X^2+…+P n X^n 3、多项式相加的功能函数函数为:node *plus_fun(node *a,node *b) 此函数根据在 1 中初始化的两个多项式进行相加运算,并存放在以c 为头指针的一个新链表中。

完整word版一元多项式求和实验报告范文_

完整word版一元多项式求和实验报告范文_

完整word版一元多项式求和实验报告范文_实验一、线性结构综合应用一、实验题目:顺序表的应用二、实验内容:一元多项式求和。

把任意给定的两个一元多项式P(某),Q(某)输入计算机,计算它们的和并输出计算结果。

三、设计分析:实现要定义的一元多项式应采用链式存储结构。

根据一元多项式相加的运算法则,对于两个多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成新多项式的一项;对于两个多项式中所有指数不同的项,分别复制到新多项式中。

新多项式不必另外生成,而是在原来的两个多项式中摘取结点即可。

采用顺序存储结构存储多项式系数A,使多项式的某些运算变得更简洁。

但在实际使用时,多项式的阶数可能很高,不同的多项式阶数可能相差很大,这使顺序存储结构的最大长度难以确定。

而且,最高次幂与最低次幂项之间缺项很多时,采用顺序存储结构显然十分浪费存储空间,因此,一般情况下多采用链式存储结构来存储高阶多项式。

在用线性链表来存储一个多项式时,多项式中的每个非零项系数对应一个结点,结点由数据元素项和指针组成。

数据元素项中包含系数和指数值,设计中先定义定义数据元素中的数据,其中有指数、系数级指针ne某t等。

并要先构造一元多项式。

在定义输出、删除、合并等模块。

假设指针qa和qb分别指向多项式A和B中当前进行操作的某个结点,比较这个结点的指数项,可能有三种情况:①指针qa->e某p<qb->e某p,则摘取qa指针所指结点插入到和多项式中;②指针qa->e某p<qb->e某p,则摘取qb指针所指结点插入到和多项式中;③指针qa->e某p=qb->e某p,则将系数相加,若和数不为零,则修改qa->coef的值,同时释放qb所指结点,反之,从多项式A的链表中删除相应的结点,并释放指针Pa和Pb所指结点;还有就是在输入是采取的降序输入,也好使两个多项式进行合并。

并输出。

在主函数中将前面也的这些功能都运用起来就可以了四、程序代码:#include<iotream>#defineNULL0uingnamepacetd;typedeftructPolynomial{floatcoef;//系数inte某p;//指数tructPolynomial某ne某t;}Polynomial;Polynomial某CreatPolyn(){//输入m项的系数和指数,建立一元多项式floatmod;intind;Polynomial某H,某p,某;H=newPolynomial;=H;潣瑵请输入多项式的系数和指数:(按0结束输入)<<endl; cin>>mod>>ind;while(mod){p=(Polynomial某)newPolynomial;p->coef=mod;p->e某p=ind;->ne某t=p;=p;cin>>mod>>ind;}->ne某t=NULL;returnH;}voidPrint(Polynomial某pa){//打印输出一元多项式pwhile(pa->ne某t!=NULL){pa=pa->ne某t;cout<<pa->coef<<某某^<<pa->e某p;if(pa->ne某t!=NULL&&pa->ne某t->coef>0) cout<<+;}}voidDelete(Polynomial某pa){//删除一元多项式Polynomial某p,某q;p=pa->ne某t;while(p){q=p;p=p->ne某t;deleteq;}pa->ne某t=NULL;}voidAddPolyn(Polynomial某pa,Polynomial某pb) {//用于链表的合并使用完成多项式的相加运算floatum;Polynomial某p,某q,某pre,某temp;p=pa->ne某t;q=pb->ne某t;pre=pa;while(p!=NULL&&q!=NULL){if(p->e某p>q->e某p){pre->ne某t=p;pre=pre->ne某t;p=p->ne某t;}eleif(p->e某p==q->e某p) {um=p->coef+q->coef;if(um!=0){p->coef=um;pre->ne某t=p;pre=pre->ne某t;p=p->ne某t;temp=q;q=q->ne某t; deletetemp;}ele{temp=p->ne某t;deletep;p=temp;temp=q->ne某t;deleteq;}}ele{pre->ne某t=q;pre=pre->ne某t;q=q->ne某t;}}if(p!=NULL)//将多项式A中剩余的结点加入到和多项式中pre->ne某t=p;elepre->ne某t=q;}intmain(){intc;intt=1;cout<<某某某某某某某某某某某某某某某某某某菜单某某某某某某某某某某某某某某某某某<<endl<<endl;cout<<.创建并显示一元多项式A和B,计算一元多项式A加B并显示和<<endl<<endl;cout<<.退出程序.<<endl;cin>>c;witch(c){cae1:Polynomial某p1,某p2;p1=CreatPolyn();潣瑵一元多项式A是:;Print(p1);cout<<endl;p2=CreatPolyn();潣瑵一元多项式B是:;Print(p2);cout<<endl;AddPolyn(p1,p2);潣瑵一元多项式A加B的和是:;Print(p1);cout<<endl;Delete(p1);break;cae2:t=0;break;}}ytem(paue);return0;}五、测试用例:六、实验总结通过这次实验,对于链表的应用知识有了更加深刻的认识,虽然中间出了很多问题,但是经过调试以后都得以解决。

一元多项式相加实验报告

一元多项式相加实验报告

一元多项式相加实验报告1. 引言本实验旨在研究一元多项式的相加操作。

一元多项式是数学中的一个重要概念,常用于代数运算和函数表达。

相加操作是多项式运算中的基本操作之一,通过对多项式的系数进行相加,可以得到一个新的多项式。

2. 实验目的本实验的主要目的是通过编写代码实现一元多项式的相加操作,并对相加操作进行测试和验证。

具体的实验目标包括: - 设计一种数据结构来表示一元多项式 -实现一元多项式的相加操作 - 编写测试代码,对相加操作进行验证3. 实验方法本实验使用Python编程语言实现一元多项式的相加操作。

具体步骤如下:3.1 设计数据结构首先,我们需要设计一种数据结构来表示一元多项式。

在本实验中,我们选择使用列表来表示一元多项式。

列表的每个元素表示一个项,项由系数和指数组成。

3.2 实现相加操作基于设计的数据结构,我们可以编写代码实现一元多项式的相加操作。

相加操作的基本思路是遍历两个多项式的项,将对应指数的系数相加,并将结果保存到一个新的多项式中。

3.3 编写测试代码为了验证相加操作的准确性,我们需要编写一些测试代码。

测试代码的主要功能是创建一些多项式,并调用相加操作进行计算。

通过比较计算结果和预期结果,可以验证相加操作的正确性。

4. 实验结果经过实验,我们成功地实现了一元多项式的相加操作。

在测试代码中,我们通过比较计算结果和预期结果,验证了相加操作的准确性。

5. 结论与讨论在本实验中,我们通过编写代码实现了一元多项式的相加操作,并进行了测试和验证。

实验结果表明,相加操作的实现是正确的。

然而,相加操作只是一元多项式运算中的基本操作之一。

在实际应用中,还需要考虑其他运算,如相减、乘法和除法等。

此外,实验中使用的数据结构可能还可以进行优化,以提高运算效率。

总的来说,本实验为进一步研究和应用一元多项式提供了基础。

通过进一步的研究和实践,可以深入理解一元多项式的运算规则,并将其应用于更广泛的数学和工程领域。

一元多项式相加问题实验报告

一元多项式相加问题实验报告

一元多项式相加问题一.问题描述设计算法实现一元多项式的简单运算。

二.数据结构设计分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数---指数”两部分组成,所以可以将它抽象成一个由“系数----指数对”构成的线性表。

基于这样的分析,可以采用一个带有头结点的单链表来表示一个一元多项式。

具体数据类型定义为:typedef struct node{float cofe; //系数域int exp; //指数域struct node* next; //指针域指向下一个子项}*polynode,poly;Polynode head_a,head_b,head_c;这三个指针分别作为链表A,B和C的头指针。

三.功能设计1.输入并建立多项式的功能模块此模块要求按照“系数---指数对”的输入格式输入各个子项,输入一个子项,通过遍历链表比较指数的大小,将新结点插在合适的位置,使多项式的指数按递增的顺序存储。

当遇到输入结束标志是停止输入,而转去执行程序下面的部分。

具体函数构造为:polynode creat_polynode(){polynode A ,p,q,s; //建立这种类型的头指针,尾指针,遍历指针和动态指针float a;int b;A=new poly;A->next=NULL;q=A;p=A;cin>>a;cin>>b;while(a!=0||b!=0){s=new poly;s->cofe=a;s->exp=b;while(q->next){if(q->next->exp<b)q=q->next; //遍历链表,若指数大于原链表指数,指针后移一个else{s->next=q->next;q->next=s;break; //若不是,将结点插入指针后面}}if(q->next==NULL){s->next=p->next;p->next=s;p=s; //q遍历到链表尾仍未插入,将结点插入最后,改变尾指针使其指向新结点}q=A; //让q返回头指针处,以便下一次遍历链表cin>>a;cin>>b;}if(p!=NULL)p->next=NULL;return A;}2.多项式相加的功能模块此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新链表中。

[计算机]一元多项式相加完整实验报告

[计算机]一元多项式相加完整实验报告

[计算机]一元多项式相加完整实验报告一元多项式的相加一实验内容根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加二需求分析1掌握线性结构的逻辑特性和物理特性。

2建立一元多项式。

3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。

4能够完成两个多项式的加减运算,并输出结果。

三概要设计1 本程序所用到的抽象数据类型:typedef OrderedLinkList polynomial;// 用带表头结点的有序链表表示多项式结点的数据元素类型定义为:typedef struct { // 项的表示oat flcoef; // 系数int expn; // 指数 term, ElemType;Void AddPolyn(polynomail&Pa,polynomail&Pb)Position GetHead()Position NextPos(LinkList L,Link p)Elem GetCurElem(Link p)int cmp(term a term b)Status SetCurElem(Link&p, ElemType e)Status DelFirst(Link h, Link &q)Status ListEmpty(LinkList L)Status Append(LinkList&L, Link S)FreeNode()2 存储结构一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。

它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。

序数coef 指数exp 指针域next创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。

3 模块划分a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图开始申请结点空间输入多项式各项的系数X,指数Y输出已输出的多项式否是否输入正确合并同类项结束四详细设计根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一元多项式求和问题的研究与实现学生姓名:指导老师:摘要在数学上,一个一元多项式可按升幂表示为:A(x)=a0+a1x+a2x2+……+anxn,它由n+1个系数唯一确定,一元多项式求和实质上是合并同类项的过程。

在实际应用中,多项式的指数可能很高且变化很大,在表示多项式的线性表中就会存在很多零元素。

因此,采用单链表来存储一个一元多项式的每一个非零项的系数和指数,即每一个非零项对应单链表中的一个结点,且单链表按指数递增有序排列,就可实现两个一元多项式求和问题。

程序通过调试运行,能基本达到设计要求,解决问题。

关键词数据结构;一元多项式;单链表;结点1 引言一个一元多项式可按升幂表示为:A(x)=a0+a1x+a2x2+……+a n x n,它由n+1个系数唯一确定。

因此,可以用一个线性表(a0,a1,a2,……,an)来表示,每一项的指数i隐含在其系数ai的序号里。

若有A(x)= a0+a1x+a2x2+……+a n x n和B(x)=b0+b1x+b2x2+……+b m x m,一元多项式求和也就是求A(x)=A(x)+B(x),这实质上是合并同类项的过程。

1.1 设计目的设计合理数据结构表示一元多项式,并设计高效算法实现两个一元多项式相加。

1.2 设计要求本课程设计要求用C++实现两个一元多项式的求和问题,用带头结点的单链表村存储多项式。

基本功能要求如下:1.输入并建立多项式,输入形式为整数序列n,x1,y1,x2,y2,……,x n,y n。

其中n是多项式的项数,x i和y i分别是第i项的系数和指数。

2.输出多项式,按指数升序排列。

3.多项式A(x)和B(x)相加,建立多项式A(x)+B(x),输出相加的多项式,形式为类数学表达式。

2 需求分析2.1 输入形式和输入值的范围从键盘依次输入两个多项式的项数,系数和指数。

系数为任意整数,项数和指数为大于等于0的整数。

2.2 输出形式从屏幕输出,显示用户输入的多项式,并显示两多项式相加后的多项式和值。

2.3 时间性能分析所谓时间性能是指实现基于某种存储结构的基本操作(即算法)的时间复杂度。

像取出线形表中第i个元素这样的按位置随机访问的操作,使用顺序表更快一些,时间性能为O(1);相比之下,单链表中按位置访问只能从表头开始依次向后扫描,直到找到那个特定的位置,所需要的平均时间为O(n)。

在单链表中进行插入和删除操作不需要移动元素,在给出指向单链表中某个合适位置的指针后,插入和删除操作所需的时间仅为O(1);而顺序表进行插入和删除操作需移动表长一半的元素,需要的平均时间为O(n)。

作为一般规律,若线性表需频繁查找却很少进行插入和删除操作,或其操作和“数据元素在线性表中的位置”密切相关时,宜采用顺序表作为存储结构;若线性表需频繁进行插入和删除操作,则宜采用单链表作为存储结构。

对于一元多项式求和问题,由于在实际应用中,多项式的指数可能很高且变化很大,一个较好的存储方法是只存非零元素。

这样,一个一元多项式的每一个非零项可由系数和指数唯一表示。

例如,S(x)=5+10x30+90x100就可以用线性表((5,0),(10,30),(90,100))来表示。

如果采用顺序表存储,对于指数相差很多的两个一元多项式,相加会改变多项式的系数和指数。

若相加的某两项的指数不等,则将两项分别加在结果中,将引起顺序表的插入;若某两项的指数相等,则系数相加,若相加结果为零,将引起顺序表的删除。

因此采用顺序表可以实现两个一元多项相加,但并不可取。

因此,经过分析,在时间性能比较上适宜采用单链表存储,则每一个非零项对应单链表中的一个结点,且单链表应按指数递增有序排列。

2.4 空间性能分析所谓空间性能是指某种存储结构所占用的存储空间的大小。

如果数据域占据的空间较小,则指针的结构性开销就占去了整个结点的大部分,因而从结点的存储密度上讲,顺序表的存储空间利用率较高。

由于顺序表需要预分配一定长度的存储空间,如果事先不知道线性表的大致长度,则有可能对存储空间预分配得过大,致使存储空间得不到充分利用,造成浪费。

若估计得过小,又将发生上溢而造成存储空间的再分配;而单链表不需要为其预分配空间,只要有内存空间可以分配,单链表中的元素个数就没有限制。

在此问题中,一个多项式虽然是由一个包括系数和指数的线性表唯一确定的,可是在实际应用中,多项式的指数往往很高且变化很大,项数也不确定,在线性表中,元素变化较大或者未知时,最好使用单链表实现。

3 概要设计3.1 数据结构设计为了实现任意多项式的加法,通过以上的时间性能和空间性能分析,选择单链表的结构体,结点结构如图3.1所示。

图3.1 一元多项式链表的结点结构其中,valuea :系数域,存放非零项的系数;valueb :指数域,存放非零项的指数;next :指针域,存放指向下一结点的指针。

3.2 程序模块设计根据以上对该一元多项式求和问题的功能要求和需求分析,到如图3.2所示的程序流程图。

图3.2 程序流程图valuea valueb next 选择1 选择2 选择4选择3 输入第一个多项式 两多项式相加 输出第一个多项式 退出程序输入第二个多项式 输出第二个多项式 输出结果运行程序7 0 2 8 12 3 4 1 6 3 2 8 5 20 7 28 ^5 12 ^4 详细设计4.1 菜单设计简单明了的主菜单是程序成功运行的首要条件。

在菜单函数中,调用了函数menuupdown(),该函数用来显示十五次短划线,用作菜单分隔符,使菜单清晰明了,易操作。

其中主要的输出语句如下:cout<<"\t\t\t ┃\t\t\t\t ┃"<<endl;cout<<"\t\t\t ┃\t1.输入一元多项式。

\t ┃"<<endl;cout<<"\t\t\t ┃\t2.输出一元多项式。

\t ┃"<<endl;cout<<"\t\t\t ┃\t3.两多项式相加。

\t ┃"<<endl;cout<<"\t\t\t ┃\t4.退出。

\t\t ┃"<<endl;cout<<"\t\t\t ┃\t\t\t\t ┃"<<endl;cout<<"\t\t\t";cout<<"┗";4.2 主模块设计该课程设计的主模块就是解决求和问题。

为运算方便,采用带头结点的单链表。

先举例分析两个多项式求和的执行过程。

设两个工作指针p 和q ,分别指向两个单链表的开始结点。

两个多项式求和实质上是对结点p 的指数域和结点q 的指数域进行比较,这会出现下列三种情况:(1)若p->valueb<q->valueb ,则结点p 应为结果中的一个结点,将指针p 后移。

示意如图4.1。

AqB图4.1 第一种情况示意图7 0 2 812 34 1 6 3 2 85 20 7 28 ^5 12 ^7 0 18 34 16 3 2 8 5 207 28 ^-2 87 0 18 34 12 8 5 20 7 28 ^ -2 85 12 ^5 12^(2)若p->valueb>q->valueb,则结点q应为结果中的一个结点,将q插入到第一个单链表中结点p之前,再将指针q后移。

示意如图4.2。

pAq qB图4.2 第二种情况示意图(3)若p->valueb=q->valueb,则p与q所指为同类项,将q的系数加到p的系数上。

若相加结果不为0,则将指针p后移,删除结点q;若相加结果为0,则表明结果中无此项,删除结点p和结点q,并将指针p和指针q分别后移。

示意如图4.3所示。

pAq qB(a)相加系数不为零p pAq qB(b)相加系数为零图4.3 第三种情况示意图算法用伪代码描述如下:1.工作指针p、q初始化;2.while(p存在且q存在)执行下列三种情形之一2.1 如果p->valueb<q->valueb,则指针p后移;2.2 如果p->valueb>q->valueb,则2.2.1 将结点q插入到结点p之前;2.2.2 指针q指向原指结点的下一个结点;2.3 如果p->valueb=q->valueb,则2.3.1 p->valuea=p->valuea+q->valuea;2.3.2 如果p->valuea==0,则执行下列操作,否则,指针p后移;2.3.2.1 删除结点p;2.3.2.2 使指针p指向它原指结点的下一个结点;2.3.3 删除结点q;2.3.4 使指针q指向它原指结点的下一个结点;3.如果q不为空,将结点q链接在第一个单链表的后面;上述伪代码描述的算法还有一个问题:将结点q插到结点p之前和将结点p删除需要知道结点p的前驱结点的地址;将结点q删除也需要知道结点q的前驱结点的地址。

所以,在每个单链表中应设两个工作指针。

4.3 类定义1.用单链表存储多项式每一非零项,为该单链表建立item,其类定义如下:class item{private:double valuea;double valueb;double corp;item * next;public:item(double ax,double bx) { }item( ) {cin>>valuea>>valueb;corp=0; next=NULL;}friend class operate;};在item类中,提供了如下成员函数:(1) 函数声明:item(double ax,double bx) { };完成的功能:有参数构造函数,主要用于生成临时一元多项式的项和头指针。

(2) 函数声明:item( ) {cin>>valuea>>valueb;corp=0;next=NULL;}完成的功能:无参数构造函数,主要用于生成一元多项式时使用。

(3) 函数声明:friend class operate;完成的功能:为了能访问到类item的私有成员,operate应指定为item类的友元类。

2.为操作建立operate,其类定义如下:class operate{private:item * head,* record;public:operate();item * gethead();void creat();item* addsame(item* atemp);void show(item * show);operate operator + (operate lasts);};在operate类中,提供了如下成员函数:(1) 函数声明:operate( );完成的功能:无参数构造函数,用于生成链表头。

相关文档
最新文档