#include<iostream>
using namespace std;
//链表是很简单的其连接是通过next指针连接的
//多项式求和用链表实现
//多项式结点
struct PNode
{
int coef;//系数
int expn;//指数
PNode* next;
};
//多项式
typedef PNode* P;
//创建多项式
void CreatP(P &Pa) {
int n;
cout << "输入多项式的个数..\n";
cin >> n;
int coef, expn;//输入系数和指数
Pa = (PNode*)malloc(sizeof(PNode));//开辟空间
PNode* p, * q;
p = Pa->next;//头结点不存值
q = Pa;
cout << "请依次输入系数和指数..按照指数升序\n";
for (int i = 0; i < n; i++) {
p = (PNode*)malloc(sizeof(PNode));
cin >> coef >> expn;
p->coef = coef;
p->expn = expn;
p->next = NULL;
q->next = p;
q = p;
}
}
//思路很简单ha一直指向的是pa的前面的数据
//当pa的指数小于pb的时候pa和ha向后移动
//当pa和pb的指数相等的时候就进行计算如果结果为0则清除pa
//反之,则先设置当前结点的系数为sum令ha=pa
//不论如何都需要将pb删除掉以及令pa向后移动。hb向后移动
//而当pa的结点大的时候就直接将pb放在ha和pa之间之后清除pb这个结点,qb向后移动ha向后移动
void Cal(P& Pa, P& Pb) {
PNode* ha, * hb, * pa, * pb;
PNode* t;
int a, b;
ha = Pa;
hb = Pb;
pa = Pa->next;
pb = Pb->next;
int sum; int exp;
//当双方都不为空的时候
while (pa && pb) {
a = pa->expn; b = pb->expn;
exp = a - b;
if (exp > 0) {//pa>pb
t = pb->next;//临时存储pb
pb->next = ha->next;
ha->next = pb;
ha = ha->next;
pb = t;
}
else if (exp == 0) {//pa=pb
sum = pa->coef + pb->coef;
if (sum == 0) {
ha->next = pa->next;
free(pa);//删除这个结点
}
else {
pa->coef = sum;
ha = pa;
}
t = pb->next;
hb->next = pb->next;
free(pb);
pb = t;
pa = ha->next;
}
else {//pa<pb
ha = pa;
pa = pa->next;
}
}
//pb还有剩余的
if (pb) {
pa = pb;
ha->next = pa;
}
}
//打印链表Pa也就是最后的结果
void PrintPa(P pa) {
PNode* p;
p = pa->next;
while (p != NULL) {
cout << "coef:" << p->coef <<"expn:" << p->expn << "\n";
p = p->next;
}
}
int main() {
P pa;
CreatP(pa);
P pb;
CreatP(pb);
Cal(pa, pb);
PrintPa(pa);
return 0;
}
多项式的加法,计算结果存储在pa内,计算的过程中当pa的指数小于pb的指数的时候pa和ha向后移动,当pa的指数大于pb的指数的时候需要进行的是要用t来存储pb的下一个结点的地址,之后再将pb对应的结点用ha连接起来,pb->next=ha->next,ha->next=pb;ha其实一直指向的是pa的前面的结点。之后再进行移动pb和hb即可,pb此时就等于刚开始存储的t,而hb此时不需要改变,因为仍然指向的是pb的前面。
当pa和pb的系数相等的时候,此时就需要判断是否为0,当其结果为0的时候此时我们需要的是,将pa在该条链表中删除和释放。当其结果不为0的时候改变pa对应的结点的系数的值。之后更新ha对应的结点。(因为在等于0的时候是删除结点pa所以ha仍然指向的是pa前面的结点不需要进行更新)而无论如何都需要删除结点pb,更新pa,更新pb,(因为hb此时仍然指向的是pb的前面所以不需要更新)。