6.3w+
社区成员
#include "stdafx.h"
/*
老实说你的程序有很多很多的毛病,什么引用的误区,还有设计函数的调用,释放空间也存在问题。等等。
看你的程序我也头痛。
不过学习过程还是要自己慢慢积累的。
o(∩_∩)o...哈哈
*/
#include <iostream>
using namespace std;
class Term
{
public:
Term(int c,int e);
Term(int c,int e, Term* nxt);
Term* InsertAfter(int c,int e);
~Term();
private:
int coef;
int exp;
Term *link;
friend ostream &operator <<(ostream &,const Term &);
friend class Polynominal;
};
Term::Term(int c, int e):coef(c),exp(e){link=0;};
Term::Term(int c, int e, Term *nxt):coef(c),exp(e){link=nxt;};
Term::~Term(){ };
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.coef)
{
case 0:
break;
case 1:
out <<"X";break;
default:
out <<"X^" <<val.exp;break;
}
return out;
};
class Polynominal
{
public:
Polynominal();
~Polynominal();
void AddTerms(istream& in);
void Output(ostream& out)const;
Polynominal& Poly_add(Polynominal& pc,int coef,int exp);
Polynominal PolyMultiply(Polynominal& r);
private:
Term* theList;
friend ostream & operator <<(ostream &,const Polynominal &);
friend istream & operator <<(istream &,Polynominal &);
friend Polynominal operator*(Polynominal &,Polynominal &);
};
Polynominal::Polynominal()
{
theList=new Term(0,-1);
theList->link=theList;
};
Polynominal::~Polynominal()
{
Term* p=theList; //释放空间好好看看数据结构的书上怎么说的。再看看和你的程序有什么程序有什么不同。
//为什么你的会错
while(p!=theList)
{
Term *q=p->link;
delete p;
p=q;
}
} ;
void Polynominal::AddTerms(istream &in)
{
Term* q=theList;
int c,e;
for(;;)
{
cout <<"输入系数,和指数(以<0结束):" <<endl;
in>>c>>e;
if(e <0)
break;
q=q->InsertAfter(c,e);
}
};
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))
out <<"+";
first=0;
out <<*p;
}
cout <<"\n" <<endl;
};
Polynominal& Polynominal::Poly_add(Polynominal& pc, int coef, int exp)
{ //我现在没有完全弄懂你这个函数是怎么设计的。还有些逻辑的错误!自己弄弄吧!
Term *p=pc.theList->link;
Term *temp=pc.theList ; ;
Term *p1,*p2;
while(temp->exp>=-1)
{
if(p->exp <exp) //如果没有返回值会怎么样啊?
{
temp=temp->InsertAfter(coef,exp);
p=p->link;
}
else if(p->exp==exp)
{
p->coef+=coef;
if(p->coef==0) /
{
p1=p;
temp->link=p->link;
p=p->link;
delete p1;
}
else
{
temp=p;
p=p->link;
}
return pc;
}
else
{
p2=temp->link;
p2->coef=coef;
p2->exp=exp;
p=p2->link;
return pc;
}
}
return pc;//总体没有返回值,有些情况没有返回值
};
Polynominal Polynominal::PolyMultiply(Polynominal& r) //你的程序有一个很大的毛病。
//返回一个局部变量的引用 引用了一个已经释放掉的变量。就会报错。对你的程序看看
{
int coef,exp;
Polynominal pz;
// Polynominal *pz=new Polynominal();
Term *a=theList->link;
// Term *b=r.theList->link;
for(;a!=theList;a=a->link)
{
Term *b=r.theList->link;
for(;b!=r.theList;b=b->link)
{
coef=(a->coef)*(b->coef);
exp=a->exp+b->exp;
Poly_add(pz,coef,exp);
}
}
return pz;
};
ostream& operator <<(ostream & out,const Polynominal &x)
{
x.Output(out);
return out;
} ;
istream& operator >>(istream& in,Polynominal &x)
{
x.AddTerms(in);
return in;
} ;
Polynominal operator*(Polynominal &a,Polynominal &b)
{
// Polynominal z=a.PolyMultiply(b);
return a.PolyMultiply(b);
};
void main()
{
Polynominal p,q,z;
cout<<"输入第一个多项式:"<<endl;
cin>>p;
cout <<p;
cin>>q;
cout <<q;
z=p*q;
cout <<z;
};
//修改了上述代码的2处提高安全性。
const Term* GetHead()const{return Headpoint;}
void Mutiply( const Polynominal& rf1, const Polynominal& rf2,Polynominal& z)
//考虑用函数,便于传递参数。
//采用引用,避免了大量的拷贝,其实也是提高效率。
{
const Term *q=rf1.GetHead();
q=q->link;
while(q!=NULL)
{
const Term*p=rf2.GetHead();
p=p->link;
while(p!=NULL)
{
z.Insert((*p)+(*q));
p=p->link;
}
q=q->link;
}
}
/*
我帮你的代码优化了一下。代码以准确,简单,效率为主
我今天的空余时间全被lz给占用了。
*/
#include "stdafx.h"
#include <iostream>
using namespace std;
namespace Poly
{
//采用命名空间实现封装数据
class Term
{
public:
Term(int c,int e):coef(c),exp(e),link(NULL){}
Term(){}
int coef;
int exp;
Term *link;
friend Term operator +( const Term& one,const Term& two);
};
Term operator +(const Term & rfone,const Term& rftwo)
{
return Term(rfone.coef*rftwo.coef,rfone.exp+rftwo.exp);
}
//多项式类
class Polynominal
{
public:
Polynominal();
~Polynominal();
void Insert(const Term& x);
friend ostream& operator <<(ostream& os,const Polynominal& rf) ;
friend istream& operator >>(istream& is,Polynominal & rf) ;
Term* GetHead(){return Headpoint;}
private:
Term* Headpoint;
Term* rearpoint;
};
Polynominal::Polynominal()
{
Headpoint=new Term;
Headpoint->coef=0;
Headpoint->exp=0;
Headpoint->link=NULL;
rearpoint=Headpoint;
}
Polynominal::~Polynominal()
{
Term* p=Headpoint;
while(p!=NULL)
{
Term *q=p->link;
delete p;
p=q;
}
}
void Polynominal::Insert(const Term& x)
{
Term * newdata=new Term;
newdata->coef=x.coef;
newdata->exp=x.exp;
newdata->link=NULL;
rearpoint->link=newdata;
rearpoint=newdata;
}
istream& operator >>(istream & is, Polynominal & rf)
{
int coef,exp;
cout<<"以系数0 为零为结束条件"<<endl;
cout<<"系数:";
cin>>coef;
cout<<"指数:";
cin>>exp;
while(coef!=0)
{
Term *newdata=new Term;
newdata->coef=coef;
newdata->exp=exp;
newdata->link=NULL;
rf.rearpoint->link=newdata;
rf.rearpoint=newdata;
cout<<"以系数0 为零为结束条件"<<endl;
cout<<"系数:";
is>>coef;
cout<<"指数:";
is>>exp;
}
return is;
}
ostream& operator << (ostream& os,const Polynominal& rf)
{
Term *p=rf.Headpoint->link;
while(p!=NULL)
{
os<<p->coef<<"X^"<<p->exp<<"+";
p=p->link;
}
return os;
}
void Mutiply( Polynominal& rf1, Polynominal& rf2,Polynominal& z)//考虑用函数,便于传递参数。
//采用引用,避免了大量的拷贝,其实也是提高效率。
{
Term *q=rf1.GetHead();
q=q->link;
while(q!=NULL)
{
Term*p=rf2.GetHead();
p=p->link;
while(p!=NULL)
{
z.Insert((*p)+(*q));
p=p->link;
}
q=q->link;
}
}
}
void main()
{
using namespace Poly;
Polynominal p,q,z;
cin>>p;
cout<<p<<endl;
cin>>q;
cout<<q<<endl;
Mutiply(p,q,z);//关键在于此,你的程序声明了太多变量了。需要很长时间赋值 ,构造。实现优化。
//还避免了,局部变量的应用问题。
cout<<endl;
cout<<"p*q=";
cout<<z<<endl;
};
Polynominal& operator*(Polynominal &a,Polynominal &b)
{
...
}
friend Polynominal operator*(Polynominal &,Polynominal &); //不一致 返回&还值啊?