【问题描述】编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是升序的,A与B之和按降序排列。例如:
多项式A: 1.2X^0 2.5X^1 3.2X^3 -2.5X^5
多项式B: -1.2X^0 2.5X^1 3.2X^3 2.5X^5 5.4X^10
多项式A与B之和:5.4X^10 6.4X^3 5X^1
【输入形式】任意两个多项式A和B
【输出形式】多项式中某一项的系数与指数,系数保留一位小数。
【样例输入】1.2 0 2.5 1 3.2 3 -2.5 5
-1.2 0 2.5 1 3.2 3 2.5 5 5.4 10
2
【样例输出】6.4 3
【样例说明】 第一个多项式的系数与指数对,以空格隔开
第二个多项式的系数与指数对,以空格隔开
输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数
【评分标准】必须用链表实现。
#include <iostream>
#include <cstdio>
using namespace std;
struct Node
{
float coef;
int exp;
Node *next;
};
class Polynomial
{
public:
Polynomial();
Polynomial(const Polynomial &B);
Polynomial operator+ (Polynomial &B);
void Printk(int k);
void Print();
private:
Node *first;
};
Polynomial :: Polynomial()
{
Node* r =NULL, * s=NULL;
first = new Node;
r=first;
char c;
do
{
s=new Node;
scanf("%f%d", &s->coef, &s->exp);
r->next=s;
r=s;
c=getchar();
}while(c != EOF&& c != '\n');
r->next=NULL;
}
Polynomial::Polynomial(const Polynomial &B)
{
first=B.first;
}
Polynomial Polynomial:: operator+(Polynomial &B)
{
Node *pre =first,*p=pre->next;
Node *qre=B.first,*q=qre->next;
while(p && q)
{
if(p->exp < q->exp)
{
pre=p;
p=p->next;
}
else if(p->exp > q->exp)
{
qre->next=q->next;
q->next=p;
pre->next=q;
pre=q;
q=qre->next;
}
else
{
p->coef = q->coef+p->coef;
if(p->coef==0)
{
pre->next = p->next;
delete p;
p=pre->next;
}
else
{
pre=p;
p=p->next;
}
qre->next=q->next;
delete q;
q=qre->next;
}
}
if(q) pre->next = q;
return *this;
}
void Polynomial::Print()
{
Node *p=first->next;
if(p)
cout<<p->coef<<"x"<<p->exp;
p=p->next;
while(p)
{
if(p->coef>0)
cout<<"+"<<p->coef<<"x"<<p->exp;
else
cout<<p->coef<<"x"<<p->exp;
p=p->next;
}
}
void Polynomial::Printk(int k)
{
Node* p=first;
int cnt = 0;
while (p&&cnt < k)
{
p= p->next;
cnt++;
}
Node* prek=first;
while(p)
{
p=p->next;
prek = prek->next;
}
printf("%.1f %d",prek->coef,prek->exp);
}
int main()
{
Polynomial A,B;
//A.Print();B.Print();
A = A+B;
//cout<<"½á¹ûÊÇ:";
//A.Print();
int k;
cin>>k;
A.Printk(k);
return 0;
}