使用数组定义数据结构实现简单的一元多项式的存储及其基本操作

ADT(Abstratc Data Type, 抽象数据类型)

ADT UnaryPoly{
数据对象:D = {p0, p1, ... , pn| n(-N, p(-R}
数据关系:R = {<p0, p1, ..., pn>| p0是一元n次多项式P(之后简称P)的0次项的系数, p1是P的1次项的系数, ..., pn是P的n次项的系数}
基本操作:
create(&P, p0, p1, ..., pn)
操作结构:构造一元n次多项式P
calculate(&ans, P, x)
初始条件:P是一元n次多项式, x是实数
操作结构:确定P的元,计算一元n次多项式的值并返回
add(&P, P1, P2)
初始条件:P1, P2是一元多项式
操作结果:返回P1, P2的和
sub(&P, P1, P2)
初始条件:P1, P2是一元多项式
操作结果:返回P1, P2的差
}ADT UnaryPoly;

 

定义数据结构

/**
 * 定义数据结构
 */
//predefine(预定义) constant(常量) maxn(n的最大值)
#define maxn 10000
typedef struct {
    double p[maxn];//各项系数
    int maxPowerNum;//一元n次多项式的最高次数
}UnaryPoly;

定义基本操作

/**
 * 定义基本操作
 */

/**
 * 构造一元多项式
 * @param p 一元n次多项式的系数数组
 * @param n 要构造的多项式的最高次数
 * @return 一元n次多项式
 */
UnaryPoly create(double* p,int n){
    UnaryPoly poly;
    poly.maxPowerNum = n;
    for (int i = 0; i <= n; ++i) {
        poly.p[i] = p[i];
    }
    return poly;
}

/**
 * 计算确定x下一元n次多项式的值
 * @param p 一元n次多项式
 * @param x 确定的未知数的值
 * @return 一元n次多项式的值
 */
double calculate(UnaryPoly p,double x){
    double ans = 0;
    for (int i = 0; i <= p.maxPowerNum; ++i) {
        ans += pow(x,i)* p.p[i];
    }
    return ans;
}

/**
 * 计算两个一元多项式之和并返回
 * @param p1 多项式p1
 * @param p2 多项式p2
 * @return 两个一元多项式之和
 */
UnaryPoly add(UnaryPoly p1, UnaryPoly p2){
    int n = max(p1.maxPowerNum,p2.maxPowerNum);
    double p[10000];
    for (int i = 0; i <= n; ++i) {
        p[i] = p1.p[i] + p2.p[i];
    }
    return create(p,n);
}

/**
 * 计算两个一元多项式之差并返回
 * @param p1 多项式p1
 * @param p2 多项式p2
 * @return 两个一元多项式之差
 */
UnaryPoly sub(UnaryPoly p1, UnaryPoly p2){
    int n = max(p1.maxPowerNum,p2.maxPowerNum);
    double p[10000];
    for (int i = 0; i <= n; ++i) {
        p[i] = p1.p[i] - p2.p[i];
    }
    return create(p,n);
}

测试所定义的ADT

int main() {
    double p1[] = {1,2,1};
    double p2[] = {1,0,4,3};
    int i[] = {1,2,3};
    UnaryPoly poly1 = create(p1,2);
    UnaryPoly poly2 = create(p2,3);
    int x = 3;
    printf("%lf\n",calculate(poly1,x));
    printf("%lf\n", calculate(poly2,4));
    UnaryPoly poly = add(poly1,poly2);
    printf("%lf\n", calculate(poly,2));
    UnaryPoly poly3 = sub(poly,poly1);
    printf("%lf\n", calculate(poly3,4));
    return 0;
}

通过定义数据结构部分的代码很容易看到这样定义的弊端:无论一元多项式有多少项,都必须预先定义大于一元多项式最高次数项的次数大小的数组来存储整个一元多项式,对于形如:p = x^10000 + x + 1的一元多项式的存储开销巨大,且空间利用率极低。故需要对数据结构进行优化。

posted @ 2020-07-12 16:24  DNoSay  阅读(572)  评论(0编辑  收藏  举报