一元多項式的運算 (待完善)

來源:互聯網
上載者:User

說明,完全照搬殷人昆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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.