用顺序表实现一元多项式的存储及运算

P n ( x ) P_n(x) = p 0 p_0 + p 1 x 1 p_1x^1 + p 2 x 2 p_2x^2 + p 3 x 3 p_3x^3 +……+ p n x n p_nx^n

序列 P P P P = ( p 0 p_0 , p 1 p_1 , p 2 p_2 , p 3 p_3 ,……, p n p_n );

同理 Q Q Q Q = ( q 0 q_0 , q 1 q_1 , q 2 q_2 , q 3 q_3 ,……, q m q_m );

R n ( x ) R_n(x) = P n ( x ) P_n(x) + Q n ( x ) Q_n(x) ; 若m < n,则

R R =( p 0 p_0 + q 0 q_0 p 1 p_1 + q 1 q_1 p 2 p_2 + q 2 q_2 ,……, p m p_m + q m q_m p ( m + 1 ) p(m+1) ,……, p n p_n ), 则多项式的的即可用顺序表存储,也可用单链表存储


1.顺序存储

1.1 不管系数是否为0,全部按幂次顺序存储,即 p [ 0 ] p[0] 存储 p 0 p_0 p [ 1 ] p[1] 存储 p 1 p_1 ,……, p [ n ] p[n] 存储 p n p_n ,此时元素下标对应 x x 的指数

S ( x ) S(x) = 5 5 + 6 x 9 6x^9 + 7 x n 7x^n

实际清况下,非零项往往很少, n n 很大时,势必造成空间的极大浪费

1.2 只存储非零项,需要为系数项 p i p_i ,指数项 e i e_i 分别分配存储空间

(( p 1 p_1 , e 1 e_1 ), ( p 2 p_2 , e 2 e_2 ), ……,( p n p_n , e n e_n ))

2.链式存储

/* --------------------------一元多项式的相加运算-------------------------- */
/* 1.指数相同的项,系数相加,若系数和不为0,则构成新项
   2.系数和不同的项,不变;连接到单链表上
   本质:在运算规则上两单链表的合并
 */
void addPoly(PolyList polyA, PolyList polyB)
{
    PolyNode *p, *q, *tail, *s;
    int sum;

    p = polyA->next;
    q = polyB->next;
    tail = polyA;
    while (p && q)
    {
        if (p->exp < q->exp)
        {
            tail->next = p;
            tail = p;
            p = p->next;
        } 
        else if (p->exp > q->exp) 
        {
            tail->next = q;
            tail = q;
            q = q->next;
        } 
        else 
        {
            sum = p->coef + q->coef;
            if (sum != 0)
            {
                p->coef = sum;

                tail->next = p; tail = p; p = p->next;
                s = q; q = q->next; free(s);
            }
            else
            {
                s = p; p = p->next; free(s);
                s = q; q = q->next; free(s);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42250302/article/details/89220195