题干
求两个一元多项式相加,求两个一元多项式 A(x) = a0 + a1x + a2x2 + … + anxn 和 B(x) = b0 + b1x + b2x2 + … + bmxm 的和,基于链表实现。
原理
两个一元多项式 A(x) = a0 + a1x + a2x2 + … + anxn 和 B(x) = b0 + b1x + b2x2 + … + bmxm 这样就可以得到一个多项式C(x)=(a0+b0)+(a1+b1)x+…+(an+bn)xn,当某A链表某项指数大于B链表某项指数时,将B项插入到A链表。当A链表某项小于B链某项指数,将A链表指针指向下一项。当A项等于B项时,将他们的系数相加,如果系数和为0,将A链和B链的项都删除。否则,删除该B项。
定义结构体
// 定义结构体
typedef struct Number {
int coeff;
int indexNumber;
Number *next;
}*Pnode;
初始化链表
void initNode(Number *num, int clothOver, int coeff) {
num->indexNumber = clothOver;
num->coeff = coeff;
num->next = NULL;
}
插入链表并合并
void insertNode(Pnode &head, int coeff, int indexNumber) {
Pnode newNode = new Number;
initNode(newNode, indexNumber, coeff);
if (head->indexNumber == -1) {
head = newNode;
return;
}
if (head->indexNumber > indexNumber) {
newNode->next = head;
head = newNode;
return;
}
Pnode indexNode = head;
while (indexNode) {
if (indexNode->indexNumber < indexNumber) {
if (indexNode->next == NULL) {
indexNode->next = newNode;
return;
} else if (indexNode->next->indexNumber > indexNumber) {
newNode->next = indexNode->next;
indexNode->next = newNode;
return;
}
} else if (indexNode->indexNumber == indexNumber) {
indexNode->coeff = coeff + indexNode->coeff;
}
indexNode = indexNode->next;
}
}
完整代码如下
#include <iostream>
// 定义结构体
typedef struct Number {
int coeff;
int indexNumber;
Number *next;
}*Pnode;
using namespace std;
// 初始化链表
void initNode(Number *num, int clothOver, int coeff) {
num->indexNumber = clothOver;
num->coeff = coeff;
num->next = NULL;
}
// 插入链表并合并多项式
void insertNode(Pnode &head, int coeff, int indexNumber) {
Pnode newNode = new Number;
initNode(newNode, indexNumber, coeff);
if (head->indexNumber == -1) {
head = newNode;
return;
}
if (head->indexNumber > indexNumber) {
newNode->next = head;
head = newNode;
return;
}
Pnode indexNode = head;
while (indexNode) {
if (indexNode->indexNumber < indexNumber) {
if (indexNode->next == NULL) {
indexNode->next = newNode;
return;
} else if (indexNode->next->indexNumber > indexNumber) {
newNode->next = indexNode->next;
indexNode->next = newNode;
return;
}
} else if (indexNode->indexNumber == indexNumber) {
indexNode->coeff = coeff + indexNode->coeff;
}
indexNode = indexNode->next;
}
}
void outputNode(Pnode head) {
while (head) {
if (head->coeff == 0) {
head = head->next;
continue;
}
if (head->next != NULL) {
cout << head->coeff << "x^" << head->indexNumber << "+";
} else {
cout << head->coeff << "x^" << head->indexNumber;
}
head = head->next;
}
}
int main() {
int number;
Pnode head1 = new Number;
initNode(head1, -1, 0);
std::cin >> number;
int coeff, indexNumber;
for (int i = 0; i < number; i++) {
cin >> coeff >> indexNumber;
insertNode(head1, coeff, indexNumber);
}
Pnode head2 = new Number;
initNode(head2, -1, 0);
cin >> number;
for (int i = 0; i < number; i++) {
cin >> coeff >> indexNumber;
insertNode(head2, coeff, indexNumber);
}
Pnode head = new Number;
initNode(head, -1, 0);
Pnode one = head1;
Pnode two = head2;
while (one) {
insertNode(head, one->coeff, one->indexNumber);
one = one->next;
}
while (two) {
insertNode(head, two->coeff, two->indexNumber);
two = two->next;
}
outputNode(head);
return 0;
}