在一般情况下使用广义表多数既非是递归表,也不为其他表所共享。对广义表可以这样理解,广义表中的一个数据元素可以是另一个广义表,一个m元多项式的表示就是广义表的这种应用的典型实例。
由于m元多项式中每一项得病变化数目的不均匀性和变元信息的重要性,故不适合用线性表。如下面这个三元多项式
这个三元多项式可以有下面的化简
所以,任何一个m元多项式都可如此做:先分解出一个主变元,随后再分解出第二个变元等等。
什么那个式子可化为:
P=z((A,2),(B,1),(15,0))
其中
A=y((C,3),(D,2))
C=x((1,10),(2,6))
D=x((3,5))
B=y((E,4),(F,1))
E=x((E,4),(F,1))
F=x((2,0))
链表结构为:
这里的exp为指数域,coef为系数域,hp指向其系数子表,tp指向同一层的下一个结点
代码如下:
typedef struct MPNode{
ELemTag tag; //区分原子结点和表结点
int exp; //指数域
union{
float coef;//系数域
struct MPNode *hp; //表结点的表头指针
};
struct MPNode *tp; //相当于线性链表的next,指向下一个元素结点
}*MPList; //m元多项式广义表类型
上面的多元式可有下面的存储结构示意图:
分析如下:
在每一层上增设一个表头结点并利用exp指示该层的变元,可用一位数组存储多项式中的所有变元,故exp域存储的是该变元在一位数组中的下标。