7-2 求两个一元多项式的和 (20分)
求两个一元多项式的和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分1行,分别以指数递降方式输出和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例1:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例1:
5 20 -4 4 -5 2 9 1 -2 0
AC代码
#include <iostream>
using namespace std;
struct Node //定义多项式链表的结点
{
int coef, exp; // coef表示系数,exp表示指数
Node *next;
};
class Polynomial
{
public:
Polynomial( ); //构造函数
~Polynomial( ); //析构函数,同单链表析构函数
Polynomial(const Polynomial &B); //拷贝构造函数
Polynomial operator + (Polynomial &B); //重载运算法,多项式相加
void Print( ); //打印一元多项式
private:
Node *first;
};
Polynomial::~Polynomial( )
{
Node *q = nullptr;
while (first != nullptr) //释放单链表的每一个结点的存储空间
{
q = first; //暂存被释放结点
first = first->next; // first指向被释放结点的下一个结点
delete q;
}
}
Polynomial :: Polynomial(const Polynomial &B){
first = B.first;
}
Polynomial :: Polynomial( )
{
Node *r = nullptr, *s = nullptr;
int coef, exp;
first = new Node; //申请头结点
r = first; r->next = nullptr; //尾插法建立单链表
//cout<<"sr xs zs:";
int nnn;
cin>>nnn;
while(nnn--){
cin >> coef >> exp;
s = new Node; s->coef = coef; s->exp = exp;
r->next = s; r = s;
}
//cout << "请输入系数和指数:";
//输入第一项的系数和指数
/*while (coef != 0 && exp != 0) //循环结束的条件是输入系数为0
{
//将结点s插入单链表的尾部
//cout<<"sr xs zs:";
//cout << "请输入系数和指数:";
cin >> coef >> exp;
}*/
r->next = nullptr;
}
Polynomial Polynomial :: operator + (Polynomial &B)
{
Node *pre = first, *p = pre->next; //工作指针pre和p初始化
Node *qre = B.first, *q = qre->next; //工作指针qre和q初始化
Node *qtemp = nullptr;
while (p != nullptr && q != nullptr)
{
if (p->exp > q->exp) { //第1种情况
pre = p; p = p->next;
}
else if (p->exp < q->exp) { //第2种情况
qtemp = q->next;
pre->next = q; //将结点q插入到结点p之前
q->next = p;
q = qtemp;
pre = q;
qre->next = q;
}
else { //第3种情况
p->coef = p->coef + q->coef;
if (p->coef == 0) { //系数相加为0,则删除结点p
pre->next = p->next;
delete p;
p = pre->next;
}
else { //系数不为0
pre = p; p = p->next;
}
qre->next = q->next; //第3种情况都要删除结点q
delete q;
q = qre->next;
}
}
if (p == nullptr) pre->next = q; //将结点q链接在第一个单链表的后面
B.first->next = nullptr;
return *this;
}
void Polynomial :: Print( )
{
Node *p = first->next;
if(p==nullptr){
cout<<0<<" "<<0<<endl;
return;
}
if (p != nullptr) /*输出第一项*/
cout << p->coef << " " << p->exp;
p = p->next;
while (p != nullptr)
{
if (p->coef > 0) /*输出系数的正号或负号*/
cout << " " << p->coef << " " << p->exp;
else
cout << " "<< p->coef << " " << p->exp;
p = p->next;
}
cout << endl;
}
int main( )
{
Polynomial A{ };
//A.Print( );
Polynomial B{ }; //定义多项式A和B
//B.Print( );
Polynomial C = A + B;
//printf("结果是:");
C.Print( ); //输出相加结果
return 0;
}
- 偷懒直接改的课本上的代码0v0
- 更改
1,输入的终止条件不同
2,数据升序降序不同,operator + 函数中<>方向改变
3,Print函数中,原函数缺少对空链表的判断,链表为空时输出0 0(测试点2)