一元多项式求和问题的研究与实现
一元多项式相加问题的实验报告
{
ﻩ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版一元多项式求和实验报告范文_实验一、线性结构综合应用一、实验题目:顺序表的应用二、实验内容:一元多项式求和。
把任意给定的两个一元多项式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页共27页一元多项式的表示及其运算的研究与实现学生姓名:蒋浩钧指导老师:乐晓波摘要一元多项式计算是用C语言设计一个一元多项式简单计算器。
它能够实现按指数降序排列建立并输出多项式,并且能够完成两个多项式的相加,想减的运算和将其结果输入的功能。
体会链式存存储结构的优缺点和适用性。
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技提高综合运用所学的理论知识和方法独立分析和解决问题的能力;加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。
关键词C语言;一元多项式;链式存存储结构;指数降序排列目录1前言--------------------------------------------31.1课程设计目的-----------------------------------3 1.2需求分析----------------------------------------3 2概要设计----------------------------------------42.1一元多项式的数学模型------------------------------4 2.2一元多项式数据结构的构造 ----------------------------------4 2.3系统结构与功能模块流程图 ----------------------------------5 3详细设计----------------------------------------73.1一元多项式的建立-----------------------------73.2一元多项式的显示------------------------------83.3一元多项式的加法运算-------------------------93.4一元多项式的减法运算-------------------------125.5一元多项式的乘法运算-------------------------143.6帮助----------------------------------------16 4调试及运行结果-----------------------------------------17 5设计体会与总结------------------------------------------19 5.1设计体会------------------------------------------19 5.2总结--------------------------------------------20 参考文献-----------------------------------------20 附录:源程序---------------------------------------------211 前言一元多项式算法程序的数据结构是选择用带头结点的单链表存储多项式。
一元多项式求和
实验二一.学生基本情况:专业班级:学号:姓名:二.实验题目、实验内容1、实验目的:(1)熟练掌握链表结构及有关算法的设计;(3)掌握用链表表示特定形式的数据的方法,并能编写出有关运算的算法。
2、实验内容:一元多项式求和。
把任意给定的两个一元多项式P(x),Q(x)输入计算机,计算它们的和并输出计算结果。
三.设计分析先构造两个项链表,分别存储两个多项式的系数和指数,然后将每个链表按指数的大小从小到大排列,以便于后来的合并。
合并的伪代码如下:当然,多项式的输出也不简单,要考虑系数是否为1,为1时x前的系数不显示,指数是否为1,为1时也不显示。
还有最前面的项如果系数为正,则不显示+号。
四.源程序代码#include<stdio.h>#include<stdlib.h>#define M 50typedef struct node//项节点{float coef;//系数float exp;//指数node * next;//下一节点}Linode;void Initlinode(Linode * &L)//初始化{L=(Linode * )malloc(sizeof(Linode));L->coef=L->exp=0;L->next=NULL;}void Createlinode(Linode * &L,int n)//建立项链表{Linode * p,* s=L;int i;for(i=0;i<n;i++){printf("输入第%d个数的系数和指数:\n",i+1);p=(Linode * )malloc(sizeof(Linode));scanf("%f%f",&(p->coef),&(p->exp));s->next=p;p->next=NULL;s=p;}}void Destroylinode(Linode * &L)//销毁链表{Linode * p=L,* s=L->next;while(s!=NULL){free(p);p=s;s=s->next;}free(p);}bool Sort(Linode * &L)//排序{Linode * p, * pre,* q;if(L->next==NULL)return 0;p=L->next->next;L->next->next=NULL;while(p!=NULL){q=p->next;pre=L;while(pre->next!=NULL&&pre->next->exp<p->exp) pre=pre->next;p->next=pre->next;pre->next=p;p=q;}return 1;}bool Plus(Linode * &A,Linode * &B)//合并多项式{Linode * p=A->next, * q=B->next,* r=A,* s;if(q==NULL)return 0;while(p!=NULL&&q!=NULL){s=q->next;if(p->exp<q->exp){while(p!=NULL&&p->exp<q->exp){p=p->next;r=r->next;}}if(p!=NULL&&p->exp>q->exp){r->next=q;q->next=p;r=q;q=s;if(s!=NULL)s=s->next;}if(p!=NULL&&q!=NULL&&p->exp==q->exp){p->coef=p->coef+q->coef;if(p->coef==0){r->next=p->next;free(p);p=r->next;}else{p=p->next;r=r->next;}free(q);q=s;}}if(q!=NULL)r->next=q;return 1;}void Displinode(Linode * &L){Linode * p=L->next;while(p!=NULL){if(p->exp==0)printf("%.4f",p->coef);else if(p==L->next&&p->coef>=0){if(p->coef==1){if(p->exp==1)printf("x");elseprintf("x^%.2f",p->exp);}else{if(p->exp==1)printf("%.4fx",p->coef);elseprintf("%.4fx^%.2f",p->coef,p->exp);}}else{if(p->coef>=0){if(p->coef==1){if(p->exp==1)printf("+x");elseprintf("+x^%.2f",p->exp);}else{if(p->exp==1)printf("+%.4fx",p->coef);elseprintf("+%.4fx^%.2f",p->coef,p->exp);}}else{if(p->coef==-1){if(p->exp==1)printf("-x");elseprintf("-x^%.2f",p->exp);}else{if(p->exp==-1)printf("%.4fx",p->coef);elseprintf("%.4fx^%.2f",p->coef,p->exp);}}}p=p->next;}printf("\n");}void main(){int m,n;Linode* A;Linode* B;Initlinode(A);Initlinode(B);printf("输入P(x)的项数:");scanf("%d",&m);Createlinode(A,m);if(Sort(A)==1)printf("排序成功\n");printf("P(x)=");Displinode(A);printf("输入Q(x)的项数:");scanf("%d",&n);Createlinode(B,n);if(Sort(B)==1)printf("排序成功\n");printf("Q(x)=");Displinode(B);if(Plus(A,B)==1)printf("表达式为F(x)=");Displinode(A);Destroylinode(A);}五.测试用例(尽量覆盖所有分支)六.实验总结对于这个实验,我最开始的想法是输入字符串,然后将字符串拆分成几个项存入链表中,然后再排序,合并。
一元多项式相加完整实验报告
一元多项式相加实验报告一元多项式的相加一实验内容根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加二需求分析1掌握线性结构的逻辑特性和物理特性。
2建立一元多项式。
3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。
4能够完成两个多项式的加减运算,并输出结果。
三概要设计1 本程序所用到的抽象数据类型:typedef OrderedLinkList polynomial;// 用带表头结点的有序链表表示多项式结点的数据元素类型定义为:typedef struct { // 项的表示float coef; // 系数int expn; // 指数 term, ElemType;V oid 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 存储结构一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。
它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。
创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。
3 模块划分a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式4 主程序流程图四详细设计根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。
数据结构一元多项式求和实验报告
xx大学xxx学院算法与数据结构试验报告设计名称:算法与数据结构设计题目:链表的应用学生学号:xx专业班级:xx学生姓名:xx学生成绩:指导教师(职称):课题工作时间:2012年4月10日说明:实验课程类别:课程内实验实验课程性质:必修适用专业、年级:2010级计算机工程、计算机网络开课院、系:计算机科学与工程学院计算机工程教研室学时:18编写依据:《算法与数据结构》实验教学大纲修订时间:2012年2月《算法与数据结构》课程实验指导书(以下简称:指导书)是针对计算机学院所开设的对应课程的上机实验而编写的教学文件,供学生上机实验时使用。
上机的工作环境要求:Windows 2000或以上操作系统、VC++ 6.0或者其它高级程序设计语言。
学生应按指导教师的要求独立完成实验,并按要求撰写实验报告。
每一个实验,编程上机调试并且提交电子文档实验报告,以学号姓名作为文件名上传。
报告内容至少包含如下内容:1、学生基本情况:专业班级、学号、姓名2、实验题目、实验内容3、设计分析4、源程序代码5、测试用例(尽量覆盖所有分支)6、实验总结一.实验内容与学时分配一、试验课题链表的应用二、试验内容一元多项式求和。
把任意给定的两个一元多项式P(x),Q(x)输入计算机,计算它们的和并输出计算结果。
三、试验分析系数指数一元多项式链表的结点结构四、源程序代码#include<stdio.h> #include<stdlib.h> /*链表数据类型定义*/ typedef struct LNode {int x,z;struct LNode *next; }LinkList;void OutLinkList(LinkList *L); /*输出函数*/void PutLinkList(LinkList *&L,int n); /*输入函数*/LinkList *AddLinkList(LinkList *a,LinkList *b); /*求和函数*/ void OutXLinkList(LinkList *L); void OutZLinkList(LinkList *L); void main() {int n,m;LinkList *a,*b,*c;printf("\t\t\t本程序可以完成两个一元多项式的加法运算。
一元多项式相加 数据结构实验报告
南昌航空大学实验报告课程名称:数据结构实验名称:实验二线性表的链式存储结构班级:080611 学生姓名:学号:08指导教师评定:签名:题目:设计并实现以下算法:给出用单链表存储多项式的结构,利用后接法生成多项式的单链表结构,实现两个多项式相加的运算,并就地逆置相加后的多项式链式。
一、需求分析1.用户可以根据自己的需求分别输入两个一元多项式,并且能够实现输入的一元多项式的显示。
2.能够完成两个一元多项式的相加功能,而且还能显示相加后的逆置的一元多项式。
3.程序执行的命令包括:(1)构造链表A (2)构造链表B (3)两个链表的相加(4)求链表的长度(5)打印(显示)已有的链表(6)将已相加的链表进行逆序排列二、概要设计⒈为实现上述算法,需要线性表的抽象数据类型:ADT Polynomial {数据对象:D={a i:|a i∈TermSet,i=1…n,n≥0TermSet 中的每个元素包含一个表示系数的实数和表示指数的整数} 数据关系:R1={<a i-1,a i>|a i-1,a i∈D,且a i-1中的指数值< a i中的指数值i=2,…n≥0}基本操作:initlink(& L)操作结果:构造一个空的链表L。
Creatlink(&L,n)操作结果:输入n项的系数和指数,建立一个非空的一元多项式L。
LinkLength(L)初始条件:链表L已经存在。
操作结果:返回一元多项式L中的项数。
Displaylink(L)初始条件:链表L已经存在。
操作结果:打印输出一元多项式L。
Addpolyn(A,B,&C)初始条件:一元多项式A和B已存在。
操作结果:完成多项式相加运算,即:C=A+B,并且带回C。
subtracypolyn(&La,&Lb,)初始条件:一元多项式La和Lb已存在。
操作结果:完成多项式的相减运算La=La+Lb,并且销毁多项式Lb。
一元多项式相加实验报告
一元多项式相加实验报告一元多项式相加实验报告引言:一元多项式是高中数学中的重要概念,它在代数运算中具有广泛的应用。
本次实验旨在通过实际操作,探究一元多项式的相加规律,并验证其正确性。
实验步骤:1. 准备工作:将实验所需材料准备齐全,包括纸张、铅笔、计算器等。
2. 设定实验目标:选择两个一元多项式进行相加操作,并记录相加过程。
3. 编写一元多项式:根据实验要求,编写两个一元多项式,如P(x)和Q(x)。
4. 相加操作:按照一元多项式相加的规则,对P(x)和Q(x)进行相加操作。
5. 记录结果:将相加的结果记录下来,并进行必要的化简。
6. 分析结果:分析相加结果的特点和规律,并与理论知识进行对比。
7. 总结实验:总结实验过程中的收获和体会,并提出相加操作的注意事项。
实验结果:通过实验操作,我们得到了两个一元多项式相加的结果。
例如,设定P(x) =2x^3 + 5x^2 - 3x + 1,Q(x) = -x^3 + 4x^2 + 2x - 2,经过相加操作后,得到R(x) = x^3 + 9x^2 - x - 1。
可以看出,相加结果的次数和系数分别是两个一元多项式次数和系数的相加。
结果分析:从实验结果中可以发现,一元多项式相加的规律是将相同次数的项的系数相加,并保留该次数的项。
这与我们在学习一元多项式时所掌握的知识是一致的。
通过实验操作,我们验证了一元多项式相加的正确性。
实验总结:本次实验通过实际操作验证了一元多项式相加的规律,加深了对一元多项式的理解。
在实验过程中,我们还发现了一些注意事项。
首先,要注意相加过程中的计算准确性,尤其是在涉及到多项式次数较高时。
其次,要注意对相加结果进行化简,以便更好地观察和分析。
最后,实验过程中要保持仔细和认真,确保实验结果的可靠性。
结论:通过本次实验,我们验证了一元多项式相加的规律,并得出了相加结果的特点和规律。
一元多项式相加是代数运算中的重要内容,掌握相加规律对于深入理解和应用一元多项式具有重要意义。
一元多项式实验报告
实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。
一、【问题描述】一元多项式相加是通过键盘输入两个形如P0+P1X1+P2X2+…+P n X n 的多项式,经过程序运算后在屏幕上输出他们的相加和。
二、【数据结构设计】分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都是有“系数-指数”两部分来组成的,所以将它可以抽象成一个由“系数-指数对”构成的线性表,由于对多项式中系数为0的子项可以不记录它的指数值,对于这样的情况就不再付出存储空间来存放它了。
基于这样的分析,我们可以采用一个带有头结点的单链表来表示一个一元多项式。
具体数据类型定义为:typedef struct Polynomial{Float coe; //系数int exp; //指数struct Polynomial *next;}*Polyn,Polynomial; 这三个指针分别作为链表A、B、C的头指针。
三、【功能(函数)设计】1、输入并建立多项式的功能模块:此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数-指数对”,输入一个子项建立一个相关结点,当遇到输入结束标志的时候就停止输入,而转去执行程序下面的部分。
2、多项式相加的功能模块此模块根据在1中建立的两个多项式进行相加的运算,并存放在以C为头指针的一个新链表中。
可以采用如下的方法进行设计:设指针p、q、r分别指向描述多项式的链表A、B、C头部,p指针按照A中结点顺序一个一个的移动,每移动一个结点,就通过q指针的移动来寻找B中是否有与p→exp相同的,(1)如果有,在C中合适的位置(注意多项式存储是按照指数递增有序的)建立新结点,并做如下赋值操作:r→coef=p→coef+q→coef;r→exp=p→exp;p→flag=1;q→flag=1; /*标志子项已参与过运算*/p=p→next;q=head_b;(2)如果没有,在C中合适的位置(注意多项式存储是按照指数递增有序的)建立新结点,并做如下赋值操作:r→coef=p→coef;r→exp=p→exp;p=p→next;q=head_b;注意:当A、B中可以相加的两项的系数和为0的时候,在C中就不用分配新的空间来进行存储了。
C++一元多项式合并实验报告
实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。
一、问题描述一元多项式相加是通过键盘输入两个形如P0+P1X1+P2X2+···+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=1ex=2ce=0ex=0 //输入结束标志input ce & ex and end with 0:ce=2ex=2ce=0ex=0 //输入结束标志输入后程序将分别建立两个链表来描述两个一元多项式:A=X^2B=2X^2这两个多项式的相加的结果应该为:C=3X^22、多项式相加的功能模块此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。
可以采用以下方法进行设计:开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。
一元多项式相加的实验报告
《数据结构》实验报告1、实验名称:实现一元多项式的加法2、实验日期: 2011-3-73、基本要求:1)编程实现一元多项式的加法;2)设计一个测试主函数。
4、实验目的:通过实验使学生掌握链表的最基本和最主要的操作:插入和删除操作。
5、测试数据:随意输入两个一元多项式的系数和指数:第一个:系数:4 8 6 7;指数:2 3 4 5第二个:系数:5 9 3 8;指数:1 3 5 6两式相加后输出结果。
6、算法思想或算法步骤:1)用尾插入法创建单链表(PLoy *create_Ploy_LinkList(void))2)输出单链表中所有结点的值,得到一元多项式(void output_Ploy_LinkList(PLoy *L, char ch))3)进行多项式的相加,采用链式存储表示加法,根据结点类型定义,若指数不同,则进行链表的合并;若指数相同,则进行系数相加;若和为0,则去掉结点;若和不为0,则修改结点的系数域。
(PLoy *add_ploy(PLoy *La, PLoy *Lb))7、模块划分:1)头文件stdiob.h。
头文件stdiob.h中包括:结点结构体定义、一元多项式的系数和指数的输入、一元多项式的输出以及两式相加输出结果的操作等;2)实现文件yydxsxj.cpp。
包含主函数int main(),其功能是测试所设计的一元多项式加法的正确性。
8、数据结构:链表中的结点的结构体定义如下:typedef struct Node{float coef; /*系数部分*/int expn; /*指数部分*/struct Node *next ;} PloyNode;9、源程序:源程序存放在两个文件中,即头文件stdiob.h和实现文件yydxsxj.cpp。
//头文件stdiob.htypedef struct Node{float coef; /*系数部分*/int expn; /*指数部分*/struct Node *next ;} PloyNode;PloyNode *create_Ploy_LinkList(void){/* 尾插入法创建单链表,链表的头结点head作为返回值 */ float coef ; int expn ;PloyNode *head, *p, *q;head=p=(PloyNode *)malloc(sizeof(PloyNode));p->next=NULL; /* 创建单链表的表头结点head */while (1){printf("\n请输入一元多项式的系数(0表示结束): ") ;scanf("%f",&coef);if (coef==0) break ;else{printf("\n请输入一元多项式的指数: ") ;scanf("%d",&expn);q=(PloyNode *)malloc(sizeof(PloyNode));q->coef=coef ; /* 指数部分赋值 */q->expn=expn ; /* 系数部分赋值 */q->next=p->next; p->next=q; p=q ;/* 钩链,新创建的结点总是作为最后一个结点 */ }}return(head);}void output_Ploy_LinkList(PloyNode *L, char ch)/* 输出以L为头结点的单链表中所有结点的值 */ {PloyNode *p;p=L->next; /* 使p指向第一个结点 */if (p==NULL) printf("\n此多项式为空!!\n\n") ;else{printf("f(x)= \n",ch) ;while (p!=NULL){if (p->coef>0)printf("%+g",p->coef) ;else printf("%g",p->coef) ;if (p->expn!=0){printf("X^") ;printf("%d",p->expn);}p=p->next;}} /* 移动指针p */printf("\n\n") ;}PloyNode *add_Ploy(PloyNode *La, PloyNode *Lb){PloyNode *Lc , *pc , *pa , *pb ,*ptr ; float x ;Lc=pc=La ; pa=La->next ; pb=Lb->next ;if(pa==NULL&&pb==NULL)printf("两个式子之和也为空项");while (pa!=NULL&&pb!=NULL){if (pa->expn< pb->expn){pc->next=pa ; pc=pa ; pa=pa->next ; } else{if (pa->expn>pb->expn){ pc->next=pb ; pc=pb ; pb=pb->next ; }else{x=pa->coef+pb->coef ;if (x==0){ ptr=pa ; pa=pa->next ;ptr=pb ; pb=pb->next ;}else{ pc->next=pa ; pa->coef=x ;pc=pa ; pa=pa->next ;ptr=pb ; pb=pb->next ;}}}}if (pa==NULL) pc->next=pb ;else pc->next=pa ;return (Lc) ;}//实现文件yydxsxj.cpp#include<iostream>#include<malloc.h>#include"stdiob.h"using namespace std;int main(){PloyNode * pa,* pb;char pc,pd;cout<<"请输入第一个多项式(按指数递增顺序输入):"<<endl; pa=create_Ploy_LinkList();output_Ploy_LinkList(pa,pc);cout<<"请输入第二个多项式(按指数递增顺序输入):"<<endl; pb=create_Ploy_LinkList();output_Ploy_LinkList(pb,pd);cout<<"多项式相加结果是:"<<endl;add_Ploy(pa,pb);output_Ploy_LinkList(pa,pc);return 0;}10、测试情况:1)程序运行输出为:第一个多项式为:f(x)=+4x^2+8x^3+6x^4+7x^5第二个多项式为:f(x)=+5x^1+9x^3+3x^5+8x^6两式相加之和为:f(x)=+5x^1+4x^2+17x^3+6x^410x^5+8x^6 2)测试结果分析:程序运行结果和预测的完全相同,说明所设计的一元多项式的加法是正确的。
一元多项式实验报告
一元多项式实验报告一元多项式实验报告引言:一元多项式是高中数学中的重要概念之一,它在代数学、几何学以及其他数学领域中都有广泛的应用。
通过实验,我们可以深入了解一元多项式的性质和运算规则,并且探索其在实际问题中的应用。
实验一:多项式的表示和运算1. 实验目的通过实验,了解多项式的表示方法和基本运算规则。
2. 实验步骤a) 多项式的表示方法选择一个简单的多项式,如3x^2 + 2x - 1,通过观察和分析,了解多项式的系数、次数和项的概念。
b) 多项式的加法和减法选择两个多项式,如2x^3 + 3x^2 - 4x + 1和x^2 + 2x - 3,进行多项式的加法和减法运算,并观察运算结果。
c) 多项式的乘法选择两个多项式,如(x + 1)(x - 2)和(2x - 1)(3x + 2),进行多项式的乘法运算,并观察运算结果。
3. 实验结果与分析通过实验,我们可以发现多项式的表示方法是以字母和指数的形式来表示,其中字母代表未知数,指数代表该项的次数。
多项式的加法和减法运算与常规的数学运算类似,只需按照相同次数的项进行系数的加减运算。
多项式的乘法运算需要将每个项进行相乘,并按照指数的规则进行合并。
实验二:多项式的因式分解和求根1. 实验目的通过实验,了解多项式的因式分解和求根的方法。
2. 实验步骤a) 多项式的因式分解选择一个多项式,如x^2 + 3x + 2,通过观察和分析,尝试将其进行因式分解。
b) 多项式的求根选择一个多项式,如x^2 - 4,通过观察和分析,尝试求解其根的值。
3. 实验结果与分析通过实验,我们可以发现多项式的因式分解是将多项式拆解为若干个乘积的形式,每个乘积中的因子是多项式的一个因式。
多项式的求根是找到使得多项式等于零的未知数值,即方程的解。
通过因式分解和求根,我们可以进一步了解多项式的性质和特点。
实验三:多项式在实际问题中的应用1. 实验目的通过实际问题,探索多项式在实际应用中的作用。
一元多项式的求和
一元多项式的求和一元多项式的求和是数学中的一个重要概念,它涉及到对多个项的系数进行加法运算,从而得到一个结果。
在代数学中,一元多项式是由一个变量和它的各次幂所组成的表达式。
求和则是将多个项相加的过程。
本文将围绕一元多项式的求和展开讨论,介绍求和的基本概念、求和的性质以及求和的应用。
一、求和的基本概念在数学中,求和是将一系列数值按照一定规则相加的运算。
对于一元多项式的求和,我们需要先了解一元多项式的基本结构。
一元多项式由一个变量和它的各次幂所组成,例如:2x^2 + 3x + 1。
其中,2、3、1是各项的系数,x^2、x、1是各项的幂次。
一元多项式的求和就是将这些项的系数相加得到的结果。
二、求和的性质求和具有以下几个重要的性质:1. 求和是可交换的:对于任意两个多项式f(x)和g(x),有f(x)+g(x)=g(x)+f(x)。
这意味着求和的顺序可以改变,不影响最终的结果。
2. 求和是可结合的:对于任意三个多项式f(x)、g(x)和h(x),有(f(x)+g(x))+h(x)=f(x)+(g(x)+h(x))。
这意味着多个多项式相加时,可以先将前两个多项式相加,再与第三个多项式相加,结果是一样的。
3. 求和的零元素:对于任意一个多项式f(x),存在一个称为零多项式的多项式0(x),使得f(x)+0(x)=f(x)。
这意味着将零多项式与任意多项式相加,结果仍然是原来的多项式。
三、求和的应用求和在数学中有着广泛的应用,尤其在代数学、概率论、统计学等领域具有重要作用。
下面以几个具体的例子来说明求和的应用:1. 等差数列求和:对于一个等差数列a,其通项公式为an=a1+(n-1)d,其中a1为首项,d为公差,n为项数。
等差数列的求和公式为Sn=(a1+an)n/2,其中Sn为前n项的和。
通过等差数列的求和公式,我们可以方便地计算出一个等差数列的和。
2. 等比数列求和:对于一个等比数列b,其通项公式为bn=b1*q^(n-1),其中b1为首项,q为公比,n为项数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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( );完成的功能:无参数构造函数,用于生成链表头。