链表多项式的加法

#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的前面所以不需要更新)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值