一元多项式的表示及相加
2015-01-25 15:50
399 查看
符号多项式的操作,已经成为表处理的典型用例。
我们对多项式采用顺序存储结构,可以只存储每项系数,指数隐含在系数的序号里。在这种情况下,如果多项式的次数很高且变化很大,那么便很难来确定顺序存储的最大长度,另外对内存空间也极为浪费。
一般情况下,对于那些多项式的次数很高,但项数不多的多项式我们可以将一元n次多项式可写成
![](http://img.blog.csdn.net/20150125164713461?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vuc2hpbmVnaXJsXzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其中,pi是指数为ei的项的非零系数,且满足
![](http://img.blog.csdn.net/20150125194104497?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vuc2hpbmVnaXJsXzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
若用一个长度为m且每个元素有两个数据项(系数项和指数项)的线性表
![](http://img.blog.csdn.net/20150125194213496?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vuc2hpbmVnaXJsXzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
便可惟一确定多项式。
在最坏的情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。不过对于那种多项式次数很高且项数不是很多的多项式来说却可以大大节省空间。
对应于线性表的两种存储结构,由系数项和指数项定义的一元多项式也可以有两种存储表示方法。在实际的应用程序中取用那一种,则要视多项式的作何种运算而定。
若只对多项式进行“求值”等不改变多项式的系数和指数的运算,则采用类似于顺序表的顺序存储结构即可,否则应采用链式存储表示。
下面主要说下如何利用线性链表的基本操作来实现一元多项式的运算。
对一元多项式的抽象数据类型定义可以:
数据对象中每个定义的元素都包含一个表示系数的实数和表示指数的整数。
数据关系中每个元素的指数值都小于后一个元素的指数值。
基本操作有:
CreatPolyn(&P,m)
输入m项的系数和指数,建立一元多项式P。
DestroyPolyn(&P)
销毁一元多项式P。
PrintPolyn(P)
打印输出一元多项式P。
PolynLength(P)
返回一元多项式P中的项数。
AddPolyn(&Pa,&Pb)
一元多项式Pa和Pb相加赋给Pa,并销毁Pb。
SubtractPolyn(&Pa,&Pb)
一元多项式Pa和Pb相减赋给Pa,并销毁Pb。
MultiplyPolyn(&Pa,&Pb)
一元多项式Pa和Pb相乘赋给Pa,并销毁Pb。
实现上述定义的一元多项式,显然应采用链式存储结构。
例如下面两个一元多项式A和B,里面每个结点表示多项式中的一项。
![](http://img.blog.csdn.net/20150125201310461?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vuc2hpbmVnaXJsXzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如何实现这种线性表表示的多项式的加法运算呢?
根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,刚构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄“和多项式”中去。
在此,按照上述抽象数据类型Polynomial中基本操作的定义,“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算规则如下:
假设指针qa和qb分别指向多项式A和多项式B中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:1、指针qa所指结点的指数值 小于 指针qb所指结点的指数值,则应摘取qa指针所指结点插入到“和多项式”链表中去;2、指针qa所指结点的指数值 大于 指针qb所指结点的指数值,则应摘取qb指针所指结点插入到“和多项式”链表中去;指针qa所指结点的指数值 等于 指针qb所指结点的指数值,则将两个结点中的系数相加,若和不为零,则修改qa所指结点的系数值,同时释放qb所指结点;若和为零,则释放指针qa和qb所指结点。
例如上图中两个链表表示的多项式A和B相加得到的“和多项式”链表如下图所示,图中的长方框表示已被释放的结点。
我们对多项式采用顺序存储结构,可以只存储每项系数,指数隐含在系数的序号里。在这种情况下,如果多项式的次数很高且变化很大,那么便很难来确定顺序存储的最大长度,另外对内存空间也极为浪费。
一般情况下,对于那些多项式的次数很高,但项数不多的多项式我们可以将一元n次多项式可写成
其中,pi是指数为ei的项的非零系数,且满足
若用一个长度为m且每个元素有两个数据项(系数项和指数项)的线性表
便可惟一确定多项式。
在最坏的情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。不过对于那种多项式次数很高且项数不是很多的多项式来说却可以大大节省空间。
对应于线性表的两种存储结构,由系数项和指数项定义的一元多项式也可以有两种存储表示方法。在实际的应用程序中取用那一种,则要视多项式的作何种运算而定。
若只对多项式进行“求值”等不改变多项式的系数和指数的运算,则采用类似于顺序表的顺序存储结构即可,否则应采用链式存储表示。
下面主要说下如何利用线性链表的基本操作来实现一元多项式的运算。
对一元多项式的抽象数据类型定义可以:
数据对象中每个定义的元素都包含一个表示系数的实数和表示指数的整数。
数据关系中每个元素的指数值都小于后一个元素的指数值。
基本操作有:
CreatPolyn(&P,m)
输入m项的系数和指数,建立一元多项式P。
DestroyPolyn(&P)
销毁一元多项式P。
PrintPolyn(P)
打印输出一元多项式P。
PolynLength(P)
返回一元多项式P中的项数。
AddPolyn(&Pa,&Pb)
一元多项式Pa和Pb相加赋给Pa,并销毁Pb。
SubtractPolyn(&Pa,&Pb)
一元多项式Pa和Pb相减赋给Pa,并销毁Pb。
MultiplyPolyn(&Pa,&Pb)
一元多项式Pa和Pb相乘赋给Pa,并销毁Pb。
实现上述定义的一元多项式,显然应采用链式存储结构。
例如下面两个一元多项式A和B,里面每个结点表示多项式中的一项。
如何实现这种线性表表示的多项式的加法运算呢?
根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,刚构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄“和多项式”中去。
在此,按照上述抽象数据类型Polynomial中基本操作的定义,“和多项式”链表中的结点无需另生成,而应该从两个多项式的链表中摘取。其运算规则如下:
假设指针qa和qb分别指向多项式A和多项式B中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:1、指针qa所指结点的指数值 小于 指针qb所指结点的指数值,则应摘取qa指针所指结点插入到“和多项式”链表中去;2、指针qa所指结点的指数值 大于 指针qb所指结点的指数值,则应摘取qb指针所指结点插入到“和多项式”链表中去;指针qa所指结点的指数值 等于 指针qb所指结点的指数值,则将两个结点中的系数相加,若和不为零,则修改qa所指结点的系数值,同时释放qb所指结点;若和为零,则释放指针qa和qb所指结点。
例如上图中两个链表表示的多项式A和B相加得到的“和多项式”链表如下图所示,图中的长方框表示已被释放的结点。
相关文章推荐
- 一元多项式表示和相加
- 线性表的应用---一元多项式的表示与相加
- 算法:一元多项式的表示及相加(链表实现)-数据结构(4)
- 【无浪】一元多项式的表示及相加
- 数据结构——一元多项式的表示及相加
- 【重学数据结构】一元多项式的表示及相加
- 一元多项式的表示及相加
- 2007.08.25一元多项式的表示及相加
- 一元多项式的表示和相加
- 利用单链表实现一元多项式的表示及相加
- 一元多项式的表示及相加
- 数据结构——链表—一元多项式的表示及相加
- 一元N次多项式的表示及相加
- 一元多项式的表示及相加 数据结构
- 一元多项式的表示及相加
- 一元多项式的表示及相加
- 数据结构学习笔记 --- 线性表 (一元多项式的表示及相加)
- Polynomial 一元多项式的表示及相加 (线性链表实现 严蔚敏版)
- Polynomial 一元多项式的表示及相加 (线性链表实现 严蔚敏版)
- 数据结构(11)线性表之一元多项式表示及相加