使用STL里标准list以及iterator实现多项式加法

使用STL里标准list以及iterator实现多项式加法

利用C++标准模板库LIST实现多项式加法,可参考课本(P526-533)。求以下两个多项式的和:
F(x)=8x7+7x4+3x2+5 G(x)=9x6+2x5+5x4+2

编译环境

在 Visual Studio 2019 平台下开发。
硬件环境:
操作系统:Windows10
处理器:Inter® Core™ i5-8300H CPU @ 2.30GHZ 2.30 GHZ
安装内存(RAM):8GB
系统类型:64 位操作系统,基于 x64 的处理器

设计思路

使用STL里的list以及iterator实现。
先将两个多项式以幂次升序排序,方便后续比较。
这里使用标准list的sort函数,并自定义排序方式函数。

struct cmp {                                       //自定义多项式的存储方式
	bool operator()(const datas& t1, const datas& t2) {
		return t1.expo < t2.expo;                  //将多项式按幂次进行升序存储
	}
};

再使用下列语句即可完成多项式按幂次的升序排序。

a2.sort(cmp());     

a2的定义如下:

list<datas> a2;

在这里插入图片描述
因为两多项式首节点的幂次一样,系数相加且不为0,将其加入和链表中,然后两个迭代器都移动一位,进行下一轮次的判断。

在这里插入图片描述

这轮比较中,iter1指向节点的幂次为2,小于iter2指向节点的幂次,所以将iter1指向的节点添加进和链表中。iter1移动一位。
在这里插入图片描述
这轮比较中,两迭代器指向节点的幂次相同,将系数相加,且系数和不为0,将新的系数(即系数和)和原幂次作为新节点添加进和链表中。
后续操作同理。
在这里插入图片描述
最后一次的添加时,iter2指向g(x)链表的尾节点的下一位,只需将f(x)的剩下节点一次添加进和链表中即可。
直到iter1移动到f(x)链表尾节点的下一位,跳出循环。至此多项式链表的相加结束。

代码实现

话不多说,直接上代码。

#include<iostream>
#include<list>
using namespace std;
class datas {
public:
	int coef;
	int expo;
	datas(int a,int y):coef(a),expo(y){}           //定义list的元素类型
};
struct cmp {                                       //自定义多项式的存储方式
	bool operator()(const datas& t1, const datas& t2) {
		return t1.expo < t2.expo;                  //将多项式按幂次进行升序存储
	}
};
list<datas>operator+(list<datas>& a1, list<datas>& a2) {
	list<datas> sumlist;                           //储存多项式和得list
	list<datas>::iterator
		iter1 = a1.begin(),                        //定义两个iterator分别指向两多项式得首节点
		iter2 = a2.begin();
	while (iter1 !=a1.end()|| iter2!=a2.end()) {   //当两个iter都遍历完各自list后循环结束
		if (iter1 == a1.end()||(iter2!=a2.end())&&iter1->expo>iter2->expo) {
			//当链表a1复制完或当前a1节点的幂大于当前a2节点的幂时,复制第二个多项式
			datas s(iter2->coef, iter2->expo);            
			sumlist.push_back(s);
			iter2++;                               //a2迭代器向后移动一位,指向a2下一个节点
		}
		else if (iter2 == a2.end() || (iter1!=a1.end())&&iter2->expo > iter1->expo) {
			//当链表a2复制完或当前a2节点的幂大于当前a1节点的幂时,复制第二个多项式
			datas s(iter1->coef, iter1->expo);             
			sumlist.push_back(s);
			iter1++;						       //a1迭代器向后移动一位,指向a1下一个节点
		}
		else {                                     //两个节点同幂
			int sum = iter1->coef + iter2->coef; 
			if (sum != 0) {                        //若两个节点系数和不为0,将其添加进和list
				datas s(sum, iter1->expo);
				sumlist.push_back(s);
			}
			iter1++;
			iter2++;                               //两迭代器都指向下一个节点
		}
	}
	return sumlist;                                //返回多项式之和
}
void priint(list<datas>& a){                       //将链表元素输出形如"ax^b+cx^d"的多项式
	list<datas>::iterator i;
	for (i = a.begin(); i != a.end(); ++i) {
		if (i == a.begin()) {
			if (i->expo == 0)
				cout << i->coef;
			else cout << i->coef << "x^" << i->expo;
		}
		else
			cout << "+" << i->coef << "x^" << i->expo;
	}
	cout << endl;
}
int main() {
	list<datas> a1;
	datas s1(8, 7);
	datas s2(7, 4);
	datas s3(3, 2);
	datas s4(5, 0);
	a1.push_back(s1);
	a1.push_back(s2);
	a1.push_back(s3);
	a1.push_back(s4);
	list<datas> a2;
	datas ss1(9, 6);
	datas ss2(2, 5);
	datas ss3(5, 4);
	datas ss4(2, 0);
	a2.push_back(ss1);
	a2.push_back(ss2);
	a2.push_back(ss3);
	a2.push_back(ss4);
	a1.sort(cmp());
	a2.sort(cmp());                                 //将多项式以幂次升序储存
	cout << "f(x)=";
	priint(a1);
	cout << "g(x)=";
	priint(a2);
	cout << "f(x)+g(x)=";
	list<datas>a3 = a1 + a2;
	priint(a3);
}

运行结果

在这里插入图片描述

总结

第一次写博客肯定有许多不足之处,我会慢慢改进。
写博客也是为了记录学习过程中发现的有意义的题目和问题,以便日后复习。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值