数据结构 PAT 02-线性结构1 一元多项式的乘法与加法运算

02-线性结构1 一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

#include 
#include 

typedef struct PolyNode *Polynomial;
struct PolyNode // 多项式结点设计
{
    int coef; // 系数
    int expon; // 指数
    Polynomial link; // 指向下一项的指针
};

// 比较两个数
int compare(int a, int b)
{
    return (a == b) ? 0 : (a > b ? 1: -1);
}

// 插入结点
void attach(int c, int e, Polynomial *pRear)
{ /* 由于在本函数中需要改变当前结果表达式尾项指针的值, 所以函数传递进来的是结点指针的地址,*pRear指向尾项 */
    Polynomial P = (Polynomial)malloc(sizeof(struct PolyNode));
    // 对新结点赋值
    P->coef = c;
    P->expon = e;
    P->link = NULL;
    (*pRear)->link = P;
    (*pRear) = P; // 修改pRear值
}

// 创建多项式
Polynomial polyCreate()
{
    Polynomial P, Rear, t;
    int c, e, N;
    
    scanf("%d", &N);
    P = (Polynomial)malloc(sizeof(struct PolyNode)); // 链表头空结点
    P->link = NULL;
    Rear = P;
    
    while (N--)
    {
        scanf("%d %d", &c, &e);
        /* 将当前项插入多项式尾部 */
        attach(c, e, &Rear);
    }
    t = P;
    P = P->link;
    free(t); // 删除临时生成的头结点
    return P;
}

// 多项式相加
Polynomial polyAdd(Polynomial P1, Polynomial P2)
{
    Polynomial front, rear, temp;
    int sum;
    // 为方便操作,先申请一个空的头结点
    rear = (Polynomial)malloc(sizeof(struct PolyNode));
    rear->link = NULL;
    front = rear;
    
    while (P1 != NULL && P2 != NULL)
    {
        switch (compare(P1->expon, P2->expon))
        {
            case 1:
                attach(P1->coef, P1->expon, &rear);
                P1 = P1->link;
                break;
            case -1:
                attach(P2->coef, P2->expon, &rear);
                P2 = P2->link;
                break;
            default:
                sum = P1->coef + P2->coef;
                if (sum)
                    attach(sum, P1->expon, &rear);
                P1 = P1->link;
                P2 = P2->link;
                break;
        }
    }
    // 处理未处理的另一个多项式的所有节点依次复制到结果多项式中去
    while (P1)
    {
        attach(P1->coef, P1->expon, &rear);
        P1 = P1->link;
    }
    while (P2)
    {
        attach(P2->coef, P2->expon, &rear);
        P2 = P2->link;
    }
    rear->link = NULL;
    temp = front;
    front = front->link; // 令front指向结果多项式第一个非零项
    free(temp); // 释放临时空表头结点
    return front;
}

// 多项式相乘
Polynomial polyMult(Polynomial P1, Polynomial P2)
{
    Polynomial P, Rear, t1, t2, temp;
    int c, e;
    
    if (!P1 || !P2)
    {
        return NULL;
    }

    t1 = P1;
    t2 = P2;
    P = (Polynomial)malloc(sizeof(struct PolyNode)); // 创建链表空头结点
    P->link = NULL;
    Rear = P;
    
    while (t2)
    {
        attach(t1->coef*t2->coef, t1->expon+t2->expon, &Rear);
        t2 = t2->link;
    }
    
    t1 = t1->link;
    while (t1)
    {
        t2 = P2;
        Rear = P;
        while (t2)
        {
            c = t1->coef*t2->coef;
            e = t1->expon + t2->expon;
            while (Rear->link && Rear->link->expon > e)
                Rear = Rear->link;
            if (Rear->link && Rear->link->expon == e)
            {
                if (Rear->link->coef + c == 0)
                {
                    temp = Rear->link;
                    Rear->link = temp->link;
                    free(temp);
                }
                else
                    Rear->link->coef += c;
            }
            else
            {
                temp = (Polynomial)malloc(sizeof(struct PolyNode));
                temp->coef = c;
                temp->expon = e;
                temp->link = Rear->link;
                Rear->link = temp;
            }
            t2 = t2->link;
        }
        t1 = t1->link;
    }
    temp = P;
    P = P->link;
    free(temp);
    return P;
}

// 打印多项式
void printPoly(Polynomial P)
{
    /* 辅助调整输出格式用 */
    int flag = 0;
    
    // 输出多项式
    if (!P)
    {
        printf("0 0\n");
        return;
    }
    while (P)
    {
        if (!flag)
            flag = 1;
        else
            printf(" ");
        printf("%d %d", P->coef, P->expon);
        P = P->link;
    }
    printf("\n");
}

int main()
{
    Polynomial p1 = polyCreate();
    
    Polynomial p2 = polyCreate();
    
    Polynomial p3 = polyMult(p1, p2);
    printPoly(p3);
    
    Polynomial p4 = polyAdd(p1, p2);
    printPoly(p4);
    
    return 0;
}


你可能感兴趣的:(数据结构及PTA题目集)