数据结构第一部分实验后半段,实现多项式的加法和乘法,其中乘法部分难度更大。这个源码继承了部分上个实验的类,属于线性表的基本运算的拓展应用
Term.h:
#include <iostream.h>
#include <string>
class Term
{
public:
Term(int c,int e);
Term(int c,int e,Term* nxt);
Term* insertafter(int c,int e);
int coef;
int exp;
Term *link;
private:
friend ostream &operator<<(ostream &,const Term &);
friend class Polynominal;
};
Term::Term(int c,int e)
{
coef=c;
exp=e;
link=NULL;
}
Term::Term(int c,int e,Term* nxt)
{
coef=c;
exp=e;
link=nxt;
}
Term* Term::insertafter(int c,int e)
{
link=new Term(c,e,link);
return link;
}
ostream &operator<<(ostream & out,const Term &val)
{
if(val.coef==0) return out;
out<<val.coef;
switch(val.exp)
{
case 0:
break;
case 1:
out<<"X";
break;
default:
out<<"X^"<<val.exp;
break;
}
return out;
}
Polynominal.h:
#include "Term.h"
#include <string>
class Polynominal
{
private:
Term *thelist;
friend ostream & operator<<(ostream &,const Polynominal &);
friend istream& operator>>(istream &,Polynominal &);
friend Polynominal& operator +(Polynominal &,Polynominal &);
friend Polynominal& operator *(Polynominal &,Polynominal &);
public:
Polynominal();
~Polynominal();
void addterms(istream& in);
void addterms(int c,int e);
void padd(Polynominal & r);
void padd(int c,int e);
void pimul(Polynominal & r);
void output(ostream &out)const;
};
Polynominal::Polynominal()
{
thelist=new Term(0,-1);
thelist->link=thelist;
}
Polynominal::~Polynominal()
{
Term* p=thelist->link;
while(p!=thelist)
{
thelist->link=p->link;
delete p;
p=thelist->link;
}
}
void Polynominal::addterms(istream& in)
{
Term* q=thelist;
int c,e;
for(;;)
{
cout<<"input a term(coef,exp):\n"<<endl;
cin>>c>>e;
if(e<0) break;
q=q->insertafter(c,e);
}
}
void Polynominal::addterms(int c,int e)
{
if(e<0) return;
Term *q=new Term(0,-1);
Term *p=thelist;
q->coef=c;
q->exp=e;
q->link=thelist;
while(p->link->exp>0)
{
p=p->link;
}
p->link=q;
}
void Polynominal::output(ostream &out)const
{
int first=1;
Term *p=thelist->link;
cout<<"the polynominal is:\n"<<endl;
for(;p!=thelist;p=p->link)
{
if(!first && (p->coef>0)) cout<<"+";
first=0;
cout<<*p;
}
cout<<"\n"<<endl;
}
void Polynominal::padd(Polynominal &r) //要求输入的多项式必须是从大到小排好的
{
Term *q,*q1=thelist,*p;
p=r.thelist->link;
q=q1->link;
while (p->exp>=0) //遍历r
{
while(p->exp<q->exp) //跳过q->exp大的项
{
q1=q;
q=q->link;
}
if(p->exp==q->exp) //合并多项式
{
q->coef=q->coef+p->coef;
if(q->coef==0) //相加等于0的处理
{
q1->link=q->link;
delete(q);
q=q1->link;
}
else
{
q1=q;
q=q->link;
}
}
else //添加新项
{
q1=q1->insertafter(p->coef,p->exp);
}
p=p->link;
}
cout<<"1";
}
void Polynominal::padd(int c,int e)
{
Term *q,*q1=thelist;
q=q1->link;
while(e<q->exp) //跳过q->exp大的项
{
q1=q;
q=q->link;
}
if(e==q->exp) //合并多项式
{
q->coef=q->coef+c;
if(q->coef==0) //相加等于0的处理
{
q1->link=q->link;
delete(q);
q=q1->link;
}
}
else //添加新项
{
q1=q1->insertafter(c,e);
}
}
void Polynominal::pimul(Polynominal &r)
{
Polynominal *a=this;
Term *p,*q;
p=thelist->link; //p=左第一个
q=r.thelist->link; //q=右第一个
Polynominal n;
while(p->exp>=0)
{
while(q->exp>=0) //死循环了
{
n.padd(p->coef*q->coef,p->exp+q->exp);
q=q->link;
}
q=r.thelist->link;
p=p->link;
}
Term *np=n.thelist->link;
//以下为向this循环赋值
thelist->link->coef=0;
thelist->link->exp=-1;
thelist->link->link=thelist;
while(np->exp>=0)
{
a->addterms(np->coef,np->exp);
np=np->link;
}
a->addterms(0,-1);
}
main.cpp:
#include "Polynominal.h"
void main()
{
Polynominal p,q,a;
cout<<"Next is for yourself...."<<endl;
cin>>p;
cout<<p;
cin>>q;
cout<<q;
q=q+p;
cout<<q;
cin>>a;
cout<<a;
q=q*a;
cout<<q;
}