用链表实现多项式的加法和乘法

多项式结构
typedef struct Node *Polynomial;
//带头结点
struct Node
{
    int Coefficient; //系数
    int Exponent;    //指数
    Polynomial Next;
};
初始化和打印多项式
//按指数递减构造多项式
Polynomial PolyCreat()
{
    int s;
    printf("请输入项数:");
    scanf("%d", &s);
    Polynomial Poly, P;
    Poly = (Polynomial)malloc(sizeof(struct Node));
    Poly->Next = NULL;
    P = Poly;
    int m, n;
    Polynomial newPoly;
    for (int i = 0; i < s; i++)
    {
        scanf("%d %d", &m, &n);
        newPoly = (Polynomial)malloc(sizeof(struct Node));
        newPoly->Coefficient = m;
        newPoly->Exponent = n;
        newPoly->Next = P->Next;
        P->Next = newPoly;
        P = P->Next;
    }
    return Poly;
}
//多项式输出
void PolyPrint(Polynomial Poly)
{
    Polynomial P;
    P = Poly->Next;
    while (P != NULL)
    {
        printf("%d %d ", P->Coefficient, P->Exponent);
        P = P->Next;
    }
    printf("\n------------\n");
}
加法
//加法
void PolynomialAdd(Polynomial Poly1, Polynomial Poly2)
{
    Polynomial P1, P2, P, end, t;
    P1 = Poly1->Next;
    P2 = Poly2->Next;
    P = (Polynomial)malloc(sizeof(struct Node));
    P->Next = NULL;
    end = P;
    while (P1 != NULL && P2 != NULL)
    {
        if (P1->Exponent == P2->Exponent)
        {
            if (P1->Coefficient + P2->Coefficient != 0)
            {
                t = (Polynomial)malloc(sizeof(struct Node));
                t->Coefficient = P1->Coefficient + P2->Coefficient;
                t->Exponent = P1->Exponent;
                t->Next = end->Next;
                end->Next = t;
                end = end->Next;
            }
            P1 = P1->Next;
            P2 = P2->Next;
        }
        else if (P1->Exponent > P2->Exponent)
        {
            end->Next = P1;
            end = P1;
            P1 = P1->Next;
        }
        else
        {
            end->Next = P2;
            end = P2;
            P2 = P2->Next;
        }
    }
    if (P1 != NULL)
        end->Next = P1;
    else
        end->Next = P2;

    //输出结果
    printf("结果:\n");
    PolyPrint(P);
}
//乘法
void PolyMult(Polynomial Poly1, Polynomial Poly2)
{
    Polynomial P1, P2, P, t, q, end;
    P1 = Poly1->Next;
    P2 = Poly2->Next;
    P = (Polynomial)malloc(sizeof(struct Node));
    P->Next = NULL;
    end = P;
    int flag = 1; //判断是否第一个结点
    //P1的每一项乘以P2的每一项
    while (P1 != NULL)
    {

        P2 = Poly2->Next;
        while (P2 != NULL)
        {
            int c, e;
            //t = (Polynomial)malloc(sizeof(struct Node));
            c = P1->Coefficient * P2->Coefficient;
            e = P1->Exponent + P2->Exponent;

            //第一个结点直接插入
            if (flag)
            {
                flag = 0;
                t = (Polynomial)malloc(sizeof(struct Node));
                t->Coefficient = c;
                t->Exponent = e;
                t->Next = end->Next;
                end->Next = t;
                end = end->Next;
            }
            //判断插入位置
            else
            {
                q = P;
                while (q->Next != NULL&&q->Next->Exponent > e)
                    q = q->Next;                        
                if (q->Next!=NULL&&q->Next->Exponent == e)    //合并
                {
                    if (q->Next->Coefficient+c==0)  //删掉
                    {
                        q->Next = q->Next->Next;
                        free(q->Next);
                    }
                    else
                        q->Next->Coefficient = q->Next->Coefficient + c;
                }
                else
                {
                    t = (Polynomial)malloc(sizeof(struct Node));
                    t->Coefficient = c;
                    t->Exponent = e;
                    t->Next = q->Next;
                    q->Next = t;
                }
            }
            
            P2 = P2->Next;
        }
        P1 = P1->Next;
    }
    PolyPrint(P);
}
主函数
int main()
{
    Polynomial P1, P2;
    P1 = PolyCreat();
    P2 = PolyCreat();
    //PolynomialAdd(P1, P2);
    PolyMult(P1, P2);
}
样例
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
//5 20 -4 4 -5 2 9 1 -2 0
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值