数据结构实验,多项式类

来源:互联网 发布:ucosii官方源码下载 编辑:程序博客网 时间:2024/05/21 10:25

多项式类头文件:

///2014.5.20 - 2013.5.24/** *该文件定义一个polynomial(多项式)类 *类中使用带头节点的链式队列存储多项式信息 *每个节点的c表示多项式每一项的系数(头结点的c表示项数) *e表示每一项的指数 *输入数据格式以下为例: *(-3.1x8)(+11x9)(+2x)(+7) *(9x)(-9x)(3x) *(6x)(-3)(-x)(+4.4x2)(-1.2x9) *(-6x)(-3)(+5.4x2)(-x2)(+7.8x15) *该类重载了输入输出运算符,和加减法运算符 *其中按照实验指导书中的要求加法操作使用对队列的操作实现 *减法运算直接调用加法运算的operation+() 函数 */#ifndef polynomial_h#define polynomial_h#include <iostream>#include <string>#include <sstream>#include <iomanip>using namespace std;//多项式节点类class polNode{public:double c ; //每个项的系数int e ;  //每个项的指数polNode * next;polNode();polNode(double cc,int ee);};//构造函数polNode::polNode(){c = e = 0;next = NULL;}polNode::polNode(double cc,int ee){c = cc, e = ee, next = NULL;}//多项式类class polynomial{private:polNode *head;public:polynomial(); //构造函数polynomial(const polynomial & ); //复制构造函数polynomial &operator=(const polynomial & ); //重载赋值运算符polynomial standardization(); //规格化,删除系数为0的项friend istream& operator>>(istream & ,  polynomial & );   //重载输入运算符friend ostream& operator<<(ostream &,  polynomial );   //重载输出运算符polynomial operator+(const polynomial &) const ; //重载加法运算符polynomial operator-(const polynomial &) const ; //重载减法运算符};//成员函数实现文件#include "polynomial.cpp"#endif

实现文件:

/** *2014.5.20 - 2014.5.24 *该文件是polynomial类的函数实现文件 *////构造函数polynomial::polynomial(){head = new polNode;}//复制构造函数polynomial::polynomial(const polynomial & b){head = new polNode;polNode * p,* k;p = b.head->next;k = this->head;while( p!=NULL ){k->next = new polNode(p->c,p->e);k = k->next;p = p->next;}this->head->c = b.head->c;}//重载赋值运算符polynomial & polynomial::operator=(const polynomial & b){//首先清空该多项式polNode * p = head ;polNode * q ;while( p != NULL ){q = p->next ;delete p;p = q;}head = new polNode ;//复制该多项式polNode * k;p = b.head->next;k = this->head;while( p!=NULL ){k->next = new polNode(p->c,p->e);k = k->next;p = p->next;}this->head->c = b.head->c;}//下面这个函数存在bug,但是没有找出到底那里出了错  ::>_<:://规格化,删除系数为0的项polynomial polynomial::standardization( ){polNode * p = head;while( p->next != NULL ){if( p->next->c == 0 ){polNode * q = p->next;p->next = q->next;delete q;head->c -- ;}if( p->next != NULL && p->next->c != 0 )p = p->next;}return *this;}///重载输入运算符istream& operator>>(istream & in,  polynomial & b){//首先清空多项式polNode * p = b.head ;polNode * q ;while( p != NULL ){q = p->next ;delete p;p = q;}b.head = new polNode ;//得到表示多项式的字符串string str;stringstream stream;in>>str;int posOfX,posOfR;while( str.length() != 0 ){  //从字符串中取出每一项进行处理posOfX = str.find('x');posOfR = str.find(')');double c ;double e ;//得到该项的c和eif( posOfX != string::npos && posOfX < posOfR ){string cc = str.substr(1,posOfX-1);if( cc.length()==1 && (cc[0]=='-') ){c = -1;}else if( cc.length()==1 && (cc[0]=='+') ){c = 1;}else{stream.clear();stream << cc ;stream >> c ;}if( posOfX+1 == posOfR ){e = 1;}else{string ee = str.substr(posOfX+1,posOfR-posOfX-1);stream.clear();stream << ee;stream >> e;}}else{string cc = str.substr(1,posOfR-1);stream.clear();stream << cc ;stream >> c ;e = 0;}//用c,e构造一个新的项加入多项式中polNode * q = new polNode(c,e);polNode * p = b.head;while( p->next != NULL && p->next->e > q->e ){p = p->next;}if( p->next != NULL && p->next->e == q->e ){p->next->c += q->c;}else{q->next = p->next;p->next = q;}//项数+1b.head->c ++ ;//从字符串中删掉表示处理过的这一项的子串str.replace(0,posOfR+1,"");}return in;}///重载输出运算符ostream& operator<<(ostream & out,  polynomial  b){//根据多项式中的每一项构造一个字符串string str = "";stringstream stream;polNode * p = b.head->next;while( p != NULL ){double c = p->c;int e = p->e;p = p->next;string strTemp;stream << c;stream >> strTemp;stream.clear();str.append("(" + strTemp + "x");stream << e;stream >>strTemp;stream.clear();str.append(strTemp + ")");}if( b.head->c == 0 ){out<<"(0x0)"<<endl;}elseout<<str<<endl;return out;}///重载加法运算符polynomial polynomial::operator+(const polynomial &b) const {/** *使用一个辅助多项式temp(对应实验要求的使用一个辅助队列) *每次处理队首的项 */polynomial temp;polNode * p,* q,* k;p = this->head->next;q = b.head->next;k = temp.head;while( p!=NULL || q!=NULL ){if( p!=NULL && q==NULL ){k->next = new polNode(p->c,p->e);k = k->next;temp.head->c ++ ;p = p->next;}else if( p==NULL && q!=NULL ){k->next = new polNode(q->c,q->e);k = k->next;temp.head->c ++ ;q = q->next;}else if( p->e > q->e ){k->next = new polNode(p->c,p->e);k = k->next;temp.head->c ++ ;p = p->next;}else if( p->e < q->e ){k->next = new polNode(q->c,q->e);k = k->next;temp.head->c ++ ;q = q->next;}else if( p->e == q->e ){k->next = new polNode(p->c+q->c,p->e);k = k->next;temp.head->c ++ ;p = p->next;q = q->next;}}return temp;}//重载减法运算符polynomial polynomial::operator-(const polynomial &b) const {//减法是加法的逆操作polynomial temp(b);polNode * p = temp.head->next;while( p!=NULL ){p->c = - p->c ;p = p->next ;}return *this + temp ;}

测试函数:

///2014.5.20//对polynomial类的测试函数#include <iostream>#include <cstdio>#include <sstream>#include <string>#include "polynomial.h"using namespace std;int main(){freopen("in","r",stdin);freopen("out","w",stdout);polynomial pol1;cin>>pol1;cout<<pol1;polynomial pol2;cin>>pol2;cout<<pol2;cout<<pol1+pol2;// cout<<pol1-pol2;polynomial pol3 = pol1+pol2;cout<<pol3;pol3.standardization();cout<<pol3;return 0;}

测试数据:

(7)(-5x8)(11x9)(-7)(5x8)(11x9)(-3.1x8)(0x9)(+2x)(+7)(9x)(-9x)(3x)(6x)(-3)(-x)(+4.4x2)(-1.2x9)(-6x)(-3)(+5.4x2)(-x2)(+7.8x15)

0 0