写一个程序,用单一连接清单表示多项式,求多项式的减法。

(1)输入的说明
-第一个多项式中的项数被输入,之后多项式的各项系数,指数对按指数的降序输入
-以相同的方式输入第二个多项式的信息

(2)输出说明
-结果多项式的各项系数,指数对按指数的降序输出

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    float coef;   //系数 
    int expn;     //指数 
    struct node *next;
}PolyNode;      //多项式节点 polynomial node 
typedef PolyNode* Polynomial;
Polynomial createPolynomial()   //创建多项式 
{
    PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点 
    head->next = NULL;
    float coef;
    int expn;
    printf("输入该多项式每一项的系数和指数,每项一行,输入0 0结束!\n");
    while (scanf("%f %d", &coef, &expn) && coef)    // 默认,按指数递减排列 
    {
        if (head->next)
        {
            p = head;
            while (p->next && expn < p->next->expn)
                p = p->next;
            if (p->next)
            {
                if (expn == p->next->expn)  //有相同指数的直接把系数加到原多项式 
                {
                    p->next->coef += coef;
                    //若是相加后系数为0,则舍弃该节点 
                    if (p->next->coef > -0.000001 && p->next->coef < 0.000001)
                    {
                        q = p->next;
                        p->next = q->next;
                        free(q);
                    }
                }
                else
                {
                    q = (PolyNode*)malloc(sizeof(PolyNode));
                    q->coef = coef;
                    q->expn = expn;
                    q->next = p->next;
                    p->next = q;
                }
            }
            else
            {
                p->next = (PolyNode*)malloc(sizeof(PolyNode));
                p = p->next;
                p->coef = coef;
                p->expn = expn;
                p->next = NULL;
            }
        }
        else
        {
            head->next = (PolyNode*)malloc(sizeof(PolyNode));
            head->next->coef = coef;
            head->next->expn = expn;
            head->next->next = NULL;
        }
    }
    return head;
}
//多项式与指定单项式相乘,该单项式为 coefx^expn 
Polynomial multiply(Polynomial poly, float coef, int expn)
{
    PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));
    p = Poly;
    q = poly->next;
    while (q)
    {
        p->next = (PolyNode*)malloc(sizeof(PolyNode));
        p = p->next;
        p->coef = (q->coef*coef);
        p->expn = (q->expn + expn);
        q = q->next;
    }
    p->next = NULL;
    return Poly;
}
void add(Polynomial poly1, Polynomial poly2)   //把 poly2 加到 poly1 上
{
    PolyNode *p, *q, *r;
    r = poly1;
    p = poly1->next;  //指向第一个节点
    q = poly2->next;
    poly2->next = NULL;
    while (p && q)
    {
        if (p->expn > q->expn)
        {
            r->next = p;
            p = p->next;
            r = r->next;
        }
        else if (p->expn < q->expn)
        {
            r->next = q;
            q = q->next;
            r = r->next;
        }
        else
        {
            PolyNode *t;
            p->coef += q->coef;
            if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0
            {
                r->next = p;
                r = r->next;
                p = p->next;
            }
            else
            {
                t = p;
                p = p->next;
                free(t);
            }
            t = q;
            q = q->next;
            free(t);
        }
    }
    if (p)
        r->next = p;
    if (q)
        r->next = q;
}
//多项式减法 poly1-poly2形成一个新的多项式
Polynomial polySubtract(Polynomial poly1, Polynomial poly2)
{
    //把poly2的系数取相反数,形成一个新的多项式
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点
    PolyNode *p, *q;
    p = poly;
    q = poly2->next;
    while (q)
    {
        p->next = (PolyNode*)malloc(sizeof(PolyNode));
        p = p->next;
        p->coef = -(q->coef);  //系数取反
        p->expn = q->expn;
        q = q->next;
    }
    p->next = NULL;
    add(poly, poly1);  //利用加法
    return poly;
}
//多项式相加 poly1+poly2形成一个新的多项式 
Polynomial polyAdd(Polynomial poly1, Polynomial poly2)
{
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点 
    poly->next = NULL;
    PolyNode *p, *q, *r;
    r = poly;
    p = poly1->next;
    q = poly2->next;
    while (p&&q)
    {
        if (p->expn > q->expn)
        {
            r->next = (PolyNode*)malloc(sizeof(PolyNode));
            r = r->next;
            r->coef = p->coef;
            r->expn = p->expn;
            p = p->next;
        }
        else if (p->expn < q->expn)
        {
            r->next = (PolyNode*)malloc(sizeof(PolyNode));
            r = r->next;
            r->coef = q->coef;
            r->expn = q->expn;
            q = q->next;
        }
        else
        {
            float m = p->coef + q->coef;
            if (!(m > -0.000001 && m < 0.000001))
            {
                r->next = (PolyNode*)malloc(sizeof(PolyNode));
                r = r->next;
                r->coef = m;
                r->expn = p->expn;
            }
            q = q->next;
            p = p->next;
        }
    }
    while (p)
    {
        r->next = (PolyNode*)malloc(sizeof(PolyNode));
        r = r->next;
        r->coef = p->coef;
        r->expn = p->expn;
        p = p->next;
    }
    while (q)
    {
        r->next = (PolyNode*)malloc(sizeof(PolyNode));
        r = r->next;
        r->coef = q->coef;
        r->expn = q->expn;
        q = q->next;
    }
    r->next = NULL;
    return poly;
}
Polynomial polyMultiply(Polynomial poly1, Polynomial poly2)   //多项式相乘  
{
    Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点 
    poly->next = NULL;
    PolyNode *p;
    p = poly2->next;
    while (p)
    {
        add(poly, multiply(poly1, p->coef, p->expn));
        p = p->next;
    }
    return poly;
}
void printPoly(Polynomial poly)    //打印多项式 
{
    if (poly && poly->next)
    {
        PolyNode *p = poly->next;  //p指向第一个节点
        while (p->next)
        {
            printf("%gx^%d", p->coef, p->expn);
            p = p->next;
            if (p && (p->coef > 0))
                printf("+");
        }
        if (p->expn == 0)
            printf("%g", p->coef);   //打印常数项 
        else
            printf("%gx^%d", p->coef, p->expn);
        printf("\n");
    }
}
void clear(Polynomial poly)   //释放内存
{
    if (poly && poly->next)
    {
        PolyNode *p, *q;
        p = poly;
        while (p)
        {
            q = p->next;
            free(p);
            p = q;
        }
    }
    poly = NULL;
}

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y