一元多项式的乘法与加法运算

//多项式求和及求积
#include<stdio.h>
#include<stdlib.h>

typedef struct Polynomial
{
    int coef;
    int exp;
    struct Polynomial *next;
} Poly, *pPoly;

int AppendNode(int coef, int exp, pPoly *rear)
{
    pPoly temp;

    temp = (pPoly)malloc(sizeof(Poly));
    temp->coef = coef;
    temp->exp = exp;
    temp->next = NULL;
    (*rear)->next = temp;
    (*rear) = temp;

    return 0;
}

pPoly ReadPoly(void)
{
    pPoly p,rear;
    int n,coef,exp;

    p = (pPoly)malloc(sizeof(Poly));
    rear = p;

    scanf("%d",&n);
    while (n--)
    {
        scanf("%d",&coef);
        scanf("%d",&exp);
        AppendNode(coef,exp,&rear);
    }
    rear = p;
    p = p->next;
    free(rear);

    return p;
}

int CompareExp(int exp1, int exp2)
{
    int result;
    if (exp1 > exp2)
    {
        result = 1;
    }
    else if (exp1 < exp2)
    {
        result = 2;
    }
    else
    {
        result = 0;
    }
    return result;
}

pPoly AddPolynomial(pPoly p1,pPoly p2)
{
    pPoly result,rear;
    result = (pPoly)malloc(sizeof(Poly));
    result->next = NULL;
    rear = result;
    int comp,sum;

    while (p1 && p2 )
    {
        comp = CompareExp(p1->exp, p2->exp);
        switch (comp)
        {
            case 0:
                sum = p1->coef + p2->coef;
                if (sum)
                    AppendNode(sum,p1->exp,&rear);
                p1 = p1->next;
                p2 = p2->next;
                break;
            case 1:
                AppendNode(p1->coef,p1->exp,&rear);
                p1 = p1->next;
                break;
            case 2:
                AppendNode(p2->coef,p2->exp,&rear);
                p2 = p2->next;
                break;
        }
    }
    if (p1)
    {
        while (p1)
        {
            AppendNode(p1->coef,p1->exp,&rear);
            p1 = p1->next;
        }
    }
    if (p2)
    {
        while (p2)
        {
            AppendNode(p2->coef,p2->exp,&rear);
            p2 = p2->next;
        }
    }

    rear = result;
    result = result->next;
    free(rear);
    return result;
}

pPoly MultPolynomial(pPoly t1,pPoly t2)
{
    pPoly rear,result,temp,p1,p2;
    int coef,exp;

    result = (pPoly)malloc(sizeof(Poly));
    result->next = NULL;
    rear = result;

    if (!t1 || !t2)
    {
        return NULL;
    }

    //先令结果有值(然后再 插入后面的结果)
    for (temp = t2; temp != NULL; temp = temp->next)
    {
        if (t1->coef * temp->coef)
            AppendNode(t1->coef * temp->coef,t1->exp + temp->exp,&rear);
    }
    //p1的第一项已经处理过
    for (p1 = t1->next; p1 != NULL; p1 = p1->next)
    {
        for (p2 = t2; p2 != NULL; p2 = p2->next)
        {
            coef = p1->coef * p2->coef;
            exp = p1->exp + p2->exp;

            temp = result;
            while (temp->next->exp > exp && temp->next->next != NULL)
                temp = temp->next;

            if (temp->next->exp == exp)
            {
                temp->next->coef += coef;
                if (temp->next->coef == 0)
                {
                    rear = temp->next;
                    temp->next = rear->next;
                    free(rear);
                }
            }
            else if (temp->next->exp < exp)
            {
                rear = (pPoly)malloc(sizeof(Poly));
                rear->coef = coef;
                rear->exp = exp;
                rear->next = temp->next;
                temp->next = rear;
            }
            else
            {
                rear = (pPoly)malloc(sizeof(Poly));
                rear->coef = coef;
                rear->exp = exp;
                rear->next = NULL;

                temp->next->next = rear;
            }
        }
    }
    temp = result;
    result = result->next;
    free(temp);
    return result;
}

void PrintResult(pPoly result)
{
    if (!result)
    {
        printf("0 0");
    }
    else
    {
        while (result)
        {
            if (result->next)
            {
                printf("%d %d ",result->coef,result->exp);
            }
            else
            {
                printf("%d %d",result->coef,result->exp);
            }
            result = result->next;
        }
    }
    printf("\n");
    return ;
}



int main()
{
    pPoly p1,p2,result,mult;

    p1 = ReadPoly();
    p2 = ReadPoly();

    mult = MultPolynomial(p1,p2);
    PrintResult(mult);

    result = AddPolynomial(p1,p2);
    PrintResult(result);

    return 0;
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值