仅供参考
#include <iostream>
using namespace std;
typedef struct PNode{
float coef; // 系数
int expn; // 指数
struct PNode *next; // 指针域
}PNode, *Polynomial;
// 首先要初始化一个空链表,用来表示多项式,然后逐个输入各项,通过比较,
// 找到第一个大于该输入项指数的项,将该输入项插入到此项的前面,
// 这样即可保证多项式链表的有序性。
void CreatePolyn(Polynomial &p, int n){
PNode *s = nullptr;
PNode *pre = nullptr;
PNode *q = nullptr;
p = new PNode; // 建立一个带头节点的单链表
p->next = nullptr;
for (int i = 1; i <=n ; ++i) { // 依次输入n个非零项
s = new PNode; // 生成新节点
printf("请输入第%d系数和指数:\n",i);
cin >> s->coef >> s->expn; // 输入系数和指数
pre = p; // pre用于保存q的前驱,初值为头结点
q = p->next; // q初始化,指向首元节点
while ( q && q->expn < s->expn ){ // 找到第一个大于输入项指数的项*q
pre = q;
q = q->next;
}
s->next = q; // 将输入项s插入到q和其前驱节点pre之间
pre->next = s;
}
}
int PrintPolyn(Polynomial &pa){
if (pa == nullptr) return -1;
PNode *p = pa->next;
while (p){
printf("%fX^%d+",p->coef, p->expn);
p = p->next;
}
return 0;
}
// 假设头指针Pa、Pb的单链表分别为A、B两个多项式的存储结构,
// 指针p1、p2分别指向A、B中进行比较的某个结点,则逐一比较两个节点中的指数项,
// 对于指数相同的项,对应系数相加,若和不为零,将其插入到“和多项式”链表中;
// 对于指数不同的项,则通过比较将指数数值较小的项插入到“和多项式”链表中去。
void AddPolyn(Polynomial &pa, Polynomial &pb){
PNode *p1, *p2, *p3, *temp;
p1 = pa->next;
p2 = pb->next;
p3 = pa;
float sum = 0;
while (p1 && p2){
if (p1->expn == p2->expn){
sum = p1->coef + p2->coef;
if (sum != 0){
p1->coef = sum;
p3->next = p1; // p3, p1下移
p3 = p1;
p1 = p1->next;
//TODO 删除p2
temp = p2; // temp储存p2的地址
p2 = p2->next; // p2下移
pb->next = p2; // pb指向新的p2
delete temp; // 删除以前的p2
} else{
//TODO 删除p1,p2
temp = p1;
p1 = p1->next;
pb->next = p1;
delete temp;
temp = p2;
p2 = p2->next;
pb->next = p2;
delete temp;
}
} else if (p1->expn < p2->expn){
//TODO 把p1插入到"和多项式"
p3->next = p1;
p3 = p1;
p1 = p1->next;
} else{
//TODO 把p2插入到"和多项式"
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
//TODO 将非空多项式的剩余段插入到p3所指节点之后
p3->next = p1?p1:p2;
//TODO 释放pb结点
delete pb;
int ret = PrintPolyn(pa);
if (ret != 0) cout << "PrintPolyn error" << endl;
}
int main() {
// A(x) = 7 + 3x + 9x^8 + 5x^17
// B(x) = 8x + 22x^7 - 9x^8
// (7, 0) (3, 1) (9, 8) (5, 17)
// (8, 1) (22, 7) (-9, 8)
Polynomial Ax, Bx;
int n1, n2;
cout << "请输入Ax的项数:" << endl;
cin >> n1;
CreatePolyn(Ax, n1);
cout << "请输入Bx的项数:" << endl;
cin >> n2;
CreatePolyn(Bx, n2);
AddPolyn(Ax, Bx);
return 0;
}
测试:
请输入第1系数和指数:
7 0
请输入第2系数和指数:
3 1
请输入第3系数和指数:
9 8
请输入第4系数和指数:
5 17
请输入第1系数和指数:
8 1
请输入第2系数和指数:
22 7
请输入第3系数和指数:
-9 8
7.000000X^0+11.000000X^1+22.000000X^7+5.000000X^17+