-
一个一元多项式可以用一个长度为 n,每个数据元素有两个数据项(系数项和指数项)的线性表来表示。
-
对于
m
元多项式:
一个m
元多项式的每一项,至多有m
个变元。
用线性表来表示,每个数据元素需要m+1
个数据项,以存储1
个系数值和m
个指数值。 -
若每个数据元素都用
m+1
个数据项来表示,会造成存储空间的浪费;
按实际大小来给每个数据元素分配空间,那么每个节点的大小是变化的,因此采用链式结构来表示m元多项式
-
实例:
P(x, y, z ) = x10y3z2 + 2x6y3z2 + 3x5y2z2 + x4y4z + 6x3y4z + 2yz + 15
改写为
P(x, y, z ) = ( ( x10 + 2x6 ) y3 + 3x5y2 ) * z2 + (( x4 + 6x3 ) y4 + 2y ) * z +15
可以把多项式 P 看作:A z2 + B z + 15 Z0,以 z 为变元的一元多项式
而 A 和 B 均又可以看作 以 y 为变元的一元多项式,依此类推。
- 用广义表来表示 m元多项式:
P = z( (A, 2), (B, 1), (15, 0) )
A = y( (C, 3), (D, 2) )
B = y( (E, 4), (F, 1) )
C = x( (1, 10), (2, 6) )
D = x( (3, 5) )
E = x( (1, 4), (6, 3) )
F = x( (2, 0) )
- 利用广义表的第二种存储结构来表示
m元多项式
其中,exp
为指数域,coef
为系数域,tp
指向同一层的下一结点
typedef struct MPNode
{
ElemType tag; // 区分原子结点0 还是表结点1
int exp; // 指数域
union
{
float coef; // 系数域
struct MPNode * hp; // 表结点的表头指针
}
struct MPNode *tp; // 相当于线性链表的next,指向下一个元素节点
} *MPList; // m 元多项式广义表类型
- 用图形表示上面的多项式
在每一层上增设一个表头结点并利用 exp域 指向该层的变元,用一个一维数组存储一个多项式中的所有变元,exp域中存对应边缘的下标即可。
头指针 p 的 exp 域中是该多项式中所有变元的个数。