說明,完全照搬殷人昆C++資料結構中的內容,但是不能正確計算及正確輸出,需要完善……
====================================
#include <iostream>
#include <math.h>
using namespace std;
struct Term
{
float ceof; //係數
int exp; //指數
Term *link;
Term(float c,int e,Term *next = NULL)
{
ceof = c;
exp = e;
link = next;
}
Term* InsertAfter(float c,int e);
friend ostream& operator<<(ostream&,const Term&);
};
Term* Term::InsertAfter( float c,int e )
{
//在當前由this指標指向的項後面插入一個新項
link = new Term(c,e,link);
return link;
}
ostream& operator<<( ostream& out,const Term& x )
{
//輸出一個項到輸出資料流out中
if(x.ceof == 0.0)
return out;
out<<x.ceof; //輸出係數
switch(x.exp) //輸出指數
{
case 0:
break;
case 1:
out<<"X";
break;
default:
out<<"X^"<<x.exp;
break;
}
return out;
}
class Polynomial
{
public:
Polynomial()
{
first = new Term(0,-1); //建立空鏈表
}
Polynomial(Polynomial& R);
int MaxOrder(); //計算最大階數
Term* getHead()const //取得多項式單鏈表的表頭指標
{
return first;
}
private:
Term *first;
friend ostream& operator <<(ostream& out,Polynomial& x);
friend istream& operator >>(istream& in,Polynomial& x);
friend Polynomial operator +(Polynomial& A,Polynomial& B);
friend Polynomial operator *(Polynomial& A,Polynomial& B);
};
ostream& operator<<( ostream& out,Polynomial& x )
{
//輸出帶附加前端節點的多項式的鏈表x
Term* current = x.getHead()->link;
cout<<"The polynomial is:"<<endl;
bool h = true;
while(current != NULL)
{
if(h=false && current->ceof > 0.0)
out<<"+";
h = false;
out<<*current; //調用Term類的重載操作"<<"
current = current->link;
}
out<<endl;
return out;
}
Polynomial::Polynomial( Polynomial& R )
{
//複製建構函式,用已有的多項式對象來初始化當前的多項式對象
first = new Term(0,-1);
Term* destptr = first;
Term* srcptr = R.getHead()->link;
while(srcptr != NULL)
{
destptr->InsertAfter(srcptr->ceof,srcptr->exp);
//在destptr所指的節點後插入新節點,再讓destptr指向這個新的節點
srcptr = srcptr->link;
destptr = destptr->link;
}
}
int Polynomial::MaxOrder()
{
//當多項式按照升序排列時,最後一項中是指數最大的項
Term* current = first;
while(current->link != NULL)
current = current->link; //空表時current停留在first,否則停在表尾節點
return current->exp;
}
istream& operator>>( istream& in,Polynomial& x )
{
//從輸入資料流in輸入各項,用尾插法建立一個多項式
Term* rear = x.getHead(); //rear是尾指標
int c,e;
while(1)
{
cout<<"Input a term(coef,exp):"<<endl;
in>>c>>e;
if(e<0)
break; //用e<0控制輸入的結束
rear = rear->InsertAfter(c,e); //連結到rear所指節點後
}
return in;
}
//************************************
//返回: Polynomial
//參數:兩個帶附加前端節點的按升冪排列的多項式鏈表的頭指標分別是A.first和B.first
//************************************
Polynomial operator+( Polynomial& A,Polynomial& B )
{
Term *pa,*pb,*pc,*p;
float temp;
Polynomial C;
pc = C.first; //pc為結果多項式R在建立過程中的尾指標
//pa、pb分別定位於A與B的第一個節點,是兩個鏈的檢測指標
pa = A.getHead()->link;
pb = B.getHead()->link;
while(pa != NULL && pb != NULL)
{
if(pa->exp == pb->exp) //係數相等
{
temp = pa->ceof + pb->ceof;
if (fabs(temp)>0.001) //相加後係數不為零
pc = pc->InsertAfter(temp,pa->exp);
pa = pa->link;
pb = pb->link;
}
else if(pa->exp < pb->exp)
{
pc = pc->InsertAfter(pa->ceof,pa->exp);
pa = pa->link;
}
else
{
pc = pc->InsertAfter(pa->ceof,pa->exp);
pb = pb->link;
}
}
if(pa != NULL)
p = pa; //p指向剩餘鏈的對象
else
p = pb;
while(p != NULL) //處理剩餘鏈的部分
{
pc = pc->InsertAfter(p->ceof,p->exp);
p = p->link;
}
return C;
}
//************************************
// 返回:返回指向儲存乘積多項式的單鏈表的頭指標
// 參數:一元多項式A和B相乘
//************************************
Polynomial operator*( Polynomial& A,Polynomial& B )
{
Term *pa,*pb,*pc;
int AL,BL,i,k,maxExp;
Polynomial C;
pc = C.getHead(); //結果多項式在建立過程中的尾指標
//兩個多項式的階數
AL = A.MaxOrder();
BL = B.MaxOrder();
if(AL != -1 && BL != -1) //沒有零多項式執行相乘運算
{
maxExp = AL+BL; //結果多項式的最高階
float * result = new float[maxExp+1];
for(i=0;i<=maxExp;i++)
result[i] = 0.0;
pa = A.getHead()->link; //多項式A的檢測指標
while(pa != NULL)
{
pb = B.getHead()->link; //多項式B的檢測指標
while(pb != NULL)
{
k = pa->exp + pb->exp; //乘積的指數
result[k] = result[k] + pa->ceof*pb->ceof;
pb = pb->link;
}
pa = pa->link;
}
//在result[]中形成計算結果
for(i = 0;i<=maxExp;i++)
if(fabs(result[i])>0.001) //該項可以插入結果多項式鏈表
pc = pc->InsertAfter(result[i],i);
delete []result;
}
pc->link = NULL;
return C;
}
int main()
{
Polynomial A,B,C;
cout<<"Input Polynomial A:"<<endl;
cin>>A;
cout<<"Input Polynomial B:"<<endl;
cin>>B;
C = A+B;
cout<<"A+B = "<<C<<endl;
C = A*B;
cout<<"A*B = "<<C<<endl;
return 1;
}