比如下面这个.cpp文件,由于将要写的main函数很长,想把它放在另一个.cpp文件里,一起编译。
请问文件头要包含什么,还有要做什么别的改动或者添加什么文件
谢谢
#include<iostream.h>
//using namespace std;
/****************************************************************************************/
template<class T>
struct Term
{
Term(int e):exp_x(e){link=NULL;}
Term(T c,int e_x,int e_y,Term *next):coef(c),exp_x(e_x),exp_y(e_y){link=next;}
Term* InsertAfter(T c,int e_x,int e_y);
T coef;
int exp_x;
int exp_y;
Term *link;
};
template<class T>
Term<T>* Term<T>::InsertAfter(T c,int e_x,int e_y)
{
link=new Term<T>(c,e_x,e_y,link);//构造新项节点<c,e>,插在当前节点及其后继节电之间
return link;
}
template<class T>
ostream & operator<<(ostream & out,const Term<T> & val)//每个单项式的输入法
{
if(val.coef==0) return out;
else
{
if((val.exp_x || val.exp_y)==0)
out<<val.coef;
else if((val.exp_y==0) && (val.exp_x!=0 ))
out<<val.coef<<"X^"<<val.exp_x<<endl;
else if((val.exp_x==0) && (val.exp_y!=0 ))
out<<val.coef<<"Y^"<<val.exp_y<<endl;
else
out<<val.coef<<"X^"<<val.exp_x<<"*Y^"<<val.exp_y<<endl;
}
return out;
}
/*******************************************************************************************/
template<class T>
class Polynomial
{
public:
Polynomial();//构造只有表头节点的单循环链表
~Polynomial();//析构函数释放多项式的各项节点
void AddTerms(istream& in);//按X降幂输入多项式各项
void Output(ostream& out)const;//输出多项式
Polynomial& PolyAdd(const Polynomial& x,const Polynomial& y);
Polynomial& PolyMul(const Polynomial& x,const Polynomial& y);
Polynomial& PolyPow(const Polynomial& x,const int& k);
void operator=(const Polynomial &x);//重载=运算符
void Clear();//清除this多项式
//Private:
Term<T>* theList;
friend ostream& operator<<(ostream&,const Polynomial&);//输出多项式
friend istream& operator>>(ostream&,const Polynomial&);//输入多项式
};
template<class T>
Polynomial<T>::Polynomial()
{
theList=new Term<T>(-1);//构造一个表头节点
theList->link=theList;//形成只有表头节点的空单循环链表
}
template<class T>
Polynomial<T>::~Polynomial()
{
Clear();//释放多项式链表的各项节点
delete theList;//释放表头节点
}
template<class T>
void Polynomial<T>::Clear()
{//释放多项式链表中的各项节点,但仍保留表头节点,代表空多项式
Term<T>* q=theList,*r;
for(r=q->link;r!=theList;r=q->link)
{
q->link=r->link;
delete r;
}
}
/********************************************************************************************/
template<class T>
void Polynomial<T>::AddTerms(istream & in)
{
Term<T>* q=theList;//q指空链表的表头节点
T c;int e_x;int e_y;
for(;;)
{
cout<<"Input a term(coef,exp_x,exp_y):\n"<<endl;
in>>c>>e_x>>e_y;
if(e_x<0)break;//如指数出现负值,输入完毕
q=q->InsertAfter(c,e_x,e_y);//构造新节点<c,e_x,e_y>,插入*q之后,q指示新节点
}
}
template <class T>
void Polynomial<T>::Output(ostream& out)const
{
bool start=true;
Term<T> *p=theList->link;//p指示最高幂次节点
out<<"The polynomial is:\n"<<endl;
for(;p!=theList;p=p->link)//p再次指向表头节点时算法终止
{
if((!start) && (p->coef>0)) out<<'+';//如果不是最高幂次项,正系数项前加'+'
start=false;//表示当前输入的项不是最高次项
out<<*p;
}
out<<endl;
}
//以上为多项式的输入和输出
/*******************************************************************************************/
int ExpComp(int e_x_1,int e_y_1,int e_x_2,int e_y_2)//以x的升幂排列
{
if((e_x_1==e_x_2)&&(e_y_1==e_y_2)) return 0;
else if((e_x_1>e_x_2)||(e_x_1==e_x_2)&&(e_y_1>e_y_2)) return 1;
else return -1;
}
template <class T>
Polynomial<T>& Polynomial<T>::PolyAdd(const Polynomial<T>& s,const Polynomial<T>& t)
{
Clear();
Term<T> *r=theList,*p=s.theList->link,*q=t.theList->link;
while(p->exp_x>=0||p->exp_y>=0||q->exp_x>=0||q->exp_y>=0)
{
switch(ExpComp(p->exp_x,p->exp_y,q->exp_x,q->exp_y))
{
case -1:
r=r->InsertAfter(q->coef,q->exp_x,q->exp_y);
q=q->link;break;
case 0:
if(q->coef+p->coef!=0)
r=r->InsertAfter(p->coef+q->coef,p->exp_x,p->exp_y);
p=p->link;q=q->link;break;
case 1:
r=r->InsertAfter(p->coef,p->exp_x,p->exp_y);
p=p->link;break;
}
}
return *this;
}
//以上为二元多项式加法的实现
/* *******************************************************************************************/
template<class T>
Polynomial<T>& Polynomial<T>::PolyMul(const Polynomial<T>& x,const Polynomial<T>& y)
{
Polynomial<T> s,t;Clear();
Term<T>* q;
Term<T>*p=y.theList->link;
for(;p!=y.theList;p=p->link)
{
s=x;
for(q=s.theList->link;q!=s.theList;q=q->link)
{q->coef=q->coef*p->coef;
q->exp_x=q->exp_x+p->exp_x;
q->exp_y=q->exp_y+p->exp_y;
}
t=PolyAdd(s,t);
}
return *this;
}
//以上为二元多项式乘法的实现
/**********************************************************************************************/
template<class T>
Polynomial<T>& Polynomial<T>::PolyPow(const Polynomial& x,const int& k)
{
Polynomial<T> s;
Clear();
int n=k;
while(n!=0)
{
s=PolyMul(x,x);
n--;
break;
}
return *this;
}
//以上为二元多项式乘方的实现
/*********************************************************************************************/
template <class T>
ostream& operator<<(ostream &out,const Polynomial<T>& s)
{
s.Output(out);
return out;
}
template<class T>
istream& operator>>(istream& in,Polynomial<T> &t)
{
t.AddTerms(in);
return in;
}
template<class T>
void Polynomial<T>::operator=(const Polynomial<T>& s)
{
if(this==&s)return;
Clear();
Term<T>* q=theList, *p=s.theList->link;
for(;p!=s.theList;p=p->link)
q=q->InsertAfter(p->coef,p->exp_x,p->exp_y);
}
//以上为重载运算符
/******************************************************************************************/
main()
{
}