多项式加法
多项式加法是多项式的一种运算,几个多项式相加的法则是:首先把带减号的多项式中的每个单项式都变号合成一个多项式,然后合并同类项,并按字典排列法写出结果(如下图)。
概念我们不难理解,但如何让计算机看懂,并用刚学过的链表实现这个功能呢(如下图)?
首先,先定义引入头文件,并定义好链表的结构体
#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;
}
运行结果如下图,跟我们预期的结果是一致的。
到此,整个多项式加法已经实现完毕~