多项式加法

多项式加法

多项式加法是多项式的一种运算,几个多项式相加的法则是:首先把带减号的多项式中的每个单项式都变号合成一个多项式,然后合并同类项,并按字典排列法写出结果(如下图)。
在这里插入图片描述

概念我们不难理解,但如何让计算机看懂,并用刚学过的链表实现这个功能呢(如下图)?
在这里插入图片描述

首先,先定义引入头文件,并定义好链表的结构体

#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
    int coefficient; //系数
    int exponent; //指数
    struct Node *next;
}Node;

接下来,定义一个创建链表的方法

Node *createNode(int coefficient, int exponent) {
    Node *node = (Node *)malloc(sizeof(Node));
    node->coefficient = coefficient;
    node->exponent = exponent;
    node->next = NULL;
    return node;
}

链表已经创建好了,接下来就是实现多项式加法的主体函数

Node *addPolynomial(Node *p1, Node *p2) {
    Node *head = createNode(0, 0); //头结点
    Node *current = head; //当前结点
    while (p1 != NULL && p2 != NULL) {
        if (p1->exponent > p2->exponent) {
            //如果第一个多项式的指数大于第二个多项式,则将第一个多项式的该节点存入新链表的下一个节点
            current->next = createNode(p1->coefficient, p1->exponent);
            p1 = p1->next;
        } else if (p1->exponent < p2->exponent) {
            //如果第一个多项式的指数大于第二个多项式,则将第一个多项式的该节点存入新链表的下一个节点
            current->next = createNode(p2->coefficient, p2->exponent);
            p2 = p2->next;
        } else {
            //如果两个多项式的指数相同,则将它们的系数相加
            int coefficient = p1->coefficient + p2->coefficient;
            if (coefficient != 0) {
                current->next = createNode(coefficient, p1->exponent);
            }
            p1 = p1->next;
            p2 = p2->next;
        }
        current = current->next;
    }
    //这里是防止两个多项式项数不相等,而导致漏项
    while (p1 != NULL) {
        current->next = createNode(p1->coefficient, p1->exponent);
        p1 = p1->next;
        current = current->next;
    }
    while (p2 != NULL) {
        current->next = createNode(p2->coefficient, p2->exponent);
        p2 = p2->next;
        current = current->next;
    }
    return head->next;
}

实现main方法进行测试

int main(int argc, const char * argv[]) {
    //创建多项式1(相当于2x^3+3x^2+x+4)
    Node *p1 = createNode(2, 3);
    p1->next = createNode(3, 2);
    p1->next->next = createNode(1, 1);
    p1->next->next->next = createNode(4, 0);
    Node *t1 = p1;
    printf("第一个多项式:");
    while (t1 != NULL) {
        printf("%dx^%d ", t1->coefficient, t1->exponent);
        if (t1->next != NULL) {
            printf("+ ");
        }
        t1 = t1->next;
    }
    printf("\n");

    //创建多项式2(相当于3x^3-x^2+2x+5)
    Node *p2 = createNode(3, 3);
    p2->next = createNode(-1, 2);
    p2->next->next = createNode(2, 1);
    p2->next->next->next = createNode(5, 0);
    Node *t2 = p2;
    printf("第二个多项式:");
    while (t2 != NULL) {
        printf("%dx^%d ", t2->coefficient, t2->exponent);
        if (t2->next != NULL) {
            printf("+ ");
        }
        t2 = t2->next;
    }
    printf("\n");

    //相加
    Node *result = addPolynomial(p1, p2);
    printf("相加结果:");
    //输出结果
    while (result != NULL) {
        if(result->exponent==0){//如果指数为0,则不用输出。
            printf("%d", result->coefficient);
        }else{
            printf("%dx^%d ", result->coefficient, result->exponent);
        }
        if (result->next != NULL) {
            printf("+ ");
        }
        result = result->next;
    }
    printf("\n");
    return 0;
}

运行结果如下图,跟我们预期的结果是一致的。
在这里插入图片描述

到此,整个多项式加法已经实现完毕~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值