一元多项式的表示及相加
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void AddPolyn (Polynomial &Pa, Polynomial &Pb) {
//多项式加法:Pa = Pa + Pb,利用两个多项式的结点构成“和多项式”。
ha = GetHead (Pa);
//ha和hb分别指向Pa和Pb的头结点
hb = GetHead (Pb);
qa = NextPos (Pa, ha);
2.熟练掌握这两类存储结构的描述方法,以及线性表的各种基 本操作的实现。
3.能够从时间复杂度中比较线性表两种存储结构的不同特点及其 适用场合。
第二章 线性表
2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示及相加
£2.4 一元多项式的表示及相加
在数学上,一个多项式可表示为: Pn(x) p0 p1x p2x2 pnxn。用 线性表可表示为 P ( p0, p1, p2,, pn ) 。
//链接Pb中剩余结点 //释放Pb的头结点
} //AddPolyn
两个一元多项式相乘的算法,可以利用两个一元多项式相加的算法来实现, 因为乘法运算可以分解为一系列的加法运算。假设A(x)和B(x)为多项式:
Pn (x) p0 p1xe1 p2 xe2 pm xem
则:M(x) = A(x) × B(x)
p0
q0
p0 + q0
p1
q1 p1 + q1
…+…
…
pm
qm
…
pm + qm …
pn
pn
但是对于形如
S(x) = 1 + 3x10000 – 2x20000
的多项式,上述表示方法是否合适?
然而,在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结 构的最大长度很难确定。例如:。就要用一长度为20001的线性表来表示,而表中 仅有3个非零元素,这种对内存空间的浪费是应该避免的。
//多项式PA中当前结点的指数值小
ha = qa;
qa = NextPos (Pa, qa);
break;
case 0:
//两者的指数值相等
sum = a.coef + b.coef;
if (sum != 0.0) {
//修改多项式PA中
//当前结点的系数值
SetCurElem (qa, sum);
= A(x) × [b1xe1 b2 xe2 来自百度文库 bn xen ]
n
= bi A(x)xei 其中每一项都是一个一元多项式。 i 1
本章小结
1.了解线性表的逻辑结构特性是数据元素之间存在着线性关 系,在计算机中表示这种关系的两类不同的存储结构是顺序 存储结构和链式存储结构。用前者表示的线性表简称为顺序 表,用后者表示的线性表简称为链表。
ha = qa;
}
else {
//删除多项式PA中当前结点
DelFirst (ha, qa);
FreeNode (qa);
}
DelFirst (hb, qb);
FreeNode (qb);
qb = NextPos (Pb, hb);
qa = NextPos (Pa, ha);
break;
case 1:
为此我们可以用单链表来实现。在单链表中每个结点有两个数据项(系数项和 指数项)。
例如: A17 (x) 7 3x 9x8 5x17 和 B8 (x) 8x 22 x7 9x8 相加。
A
-1
70
31
98
5 17 ^
B
-1
81
22 7
-9 8 ^
C
-1
70
11 1
5 17 ^
22 7
图2.14 多项式相加链式存储结构示例
//多项式PB中当前结点的指数值小
DelFirst (hb, qb);
InsFirst (ha, qb);
qb = NextPos (Pb, hb);
ha = NextPos (Pa, ha);
break;
} //switch
} //while
if (!ListEmpty (pb))
Append (Pa, qb); FreeNode (hb);
假设 Qm (x)是一元m次多项式:Qm (x) q0 q1x q2x2 qmxm(m<n)。
则两个多项式相加的结果: Rn (x) Pn (x) Qm (x) 。用线性表可表示 为:R ( p0 q0, p1 q1,, pm qm, pm1,, pn) 。
若对P,Q,R采用顺序存储结构,则问题很简单:
一元多项式的实现:
typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式
结点的数据元素类型定义为:
typedef struct { // 项的表示
float coef;
// 系数
int expn;
// 指数
} term, ElemType;
多项式相加 算法2.15如下:
//qa和qb分别指向Pa和Pb中当前结点
qb = NextPos (Pb, hb);
while (qa && qb) {
//qa和qb均非空
a = GetCurElem (qa);
//a和b为两表中当前比较元素
b = GetCurElem (qb);
switch (*cmp(a, b)) {
case -1: