使用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);
}
运行结果
总结
第一次写博客肯定有许多不足之处,我会慢慢改进。
写博客也是为了记录学习过程中发现的有意义的题目和问题,以便日后复习。