//#include "stdafx.h"
#include<iostream>
using namespace std;
#include<stdlib.h>
#include"stdio.h"
struct Term
{
int exp; //指数
double coef; //系数
};
struct Node
{
Term data; //结点内容,为TERM结构
struct Node *next;
};
template <typename T>
class Polynomial //多项式类
{
public:
Polynomial(Node* p) :front(p),n(0) //构造函数
{
p->data.coef=-1;
p->data.exp=-1;
p->next=NULL;
}
~Polynomial() { } //析构函数
void Print(); //显示
void Delete(Node *p); //销毁多项式值为0的项
int Getlength(); //获取多项式长度
void Setn();
void Getfront();
void Row(); //将多项式降序排序
T Power(T n, T x); //计算x^n,用于赋值
void Plus(Polynomial &B,Polynomial &R); //相加
void Minus(Polynomial &B,Polynomial &R); //相减
void Oppo(); //系数相反数,用于相减
void Evalute(double x); //赋值
void Derivate(Polynomial &R); //求导
void Multiply(Polynomial &B,Polynomial &R); //相乘
void destroyLink(); //销毁多项式
void menuPrint(); //菜单
void createLink(int n); //创建多项式
void Over(); //退出
int n;
double result;
private:
Node *front;
};
//计算x^n,用于赋值
template<class T>
T Polynomial<T>::Power(T n, T x)
{
double result=1;
for(int i=1;i<=n;i++)
result=result*x;
return result;
}
template<class T>
int Polynomial<T>::Getlength()
{
Node *p=front;
if (p == NULL)
return 0;
while(p->next!=NULL)
{
n++;
p=p->next;
}
return n;
}
//显示
template<class T>
void Polynomial<T>::Print()
{
Row();
if((front==NULL)||(front->next==NULL))
{
cout<<"一元多项式为空"<<endl;
}
else
{
Node *p=front->next;
if(p->data.exp!=0)
cout<<"Poly= "<<p->data.coef<<"x^"<<p->data.exp;
else if(p->data.exp==0)
cout<<"Poly= "<<p->data.coef;
if(p->next!=NULL)
{
p=p->next;
while(1)
{
if((p->data.coef<0)&&(p->data.exp!=0))
cout<<p->data.coef<<"x^"<<p->data.exp;
else if((p->data.coef>0)&&(p->data.exp!=0))
cout<<"+"<<p->data.coef<<"x^"<<p->data.exp;
else if((p->data.coef<0)&&(p->data.exp==0))
cout<<p->data.coef;
else if((p->data.coef>0)&&(p->data.exp==0))
cout<<"+"<<p->data.coef;
if(p->next!=NULL)
p=p->next;
else
break;
}
}
}
cout<<endl;
}
//销毁多项式值为0的项
template<class T>
void Polynomial<T>::destroyLink()
{
Node* a=front->next;
if(!a) throw "一元多项式已为空!";//抛出异常
while(1)
{
if(a->next)
{
Node* b=a;
a=a->next;
delete b;
}
else
{
delete a;
break;
}
}
front->next=NULL;
}
template<class T>
void Polynomial<T>::Delete(Node *p)
{
Node *q=front
;
while(q->next!=p)
q=q->next;
p=q;
q=q->next;
delete q;
}
template<class T>
void Polynomial<T>::createLink(int n)
{
if(front->next!=NULL)
{
destroyLink();
}
Node *a=front;
for(int i=1;i<=n;i++)
{
a->next=new Node;
a=a->next;
a->next=NULL;
cout<<"请输入第"<<i<<"项的系数和指数:"<<endl;
cout<<"系数:";
cin>>(a->data).coef;
cout<<"指数:";
cin>>(a->data).exp;
if(a->data.exp<0)
{
cout<<"您输入有误,指数不允许为负值!"<<endl;
Delete(a);
i--;
continue;
}
if(a->data.coef==0)
{
cout<<"系数为零,重新输入!"<<endl;
Delete(a);
i--;
continue;
}
}
}
template<class T>
void Polynomial<T>::Setn()
{
n=Getlength();
}
template<class T>
void Polynomial<T>::Getfront()
{
Node *front=new Node;
}
//将多项式降序排序与合并同类项
template<class T>
void Polynomial<T>::Row()
{
Node *p=front->next;
Node *q=front->next;
Node *t=front->next;
while(1) //冒泡排序
{
p=t;
q=p->next;
while(q)
{
if(p->data.exp>q->data.exp)
{
if(q->next)
q=q->next;
else
break;
}
else if(p->data.exp==q->data.exp) //合并同类项
{
p->data.coef=p->data.coef+q->data.coef;
Node *temp=front;
while(temp->next!=q)
temp=temp->next;
if(q->next)
{
q=temp;
temp=temp->next;
q->next=temp->next;
delete temp;
q=q->next;
}
else
{
q=temp;
temp=temp->next;
delete temp;
q->next=NULL;
break;
}
}
else
{
Node *temp = new Node;
temp->data=q->data;
q->data=p->data;
p->data=temp->data;
delete temp;
if(q->next)
q=q->next;
else
break;
}
}
if(t->next)
{
t=t->next;
}
else
break;
}
Setn();
}
template<class T>
void Polynomial<T>::Plus(Polynomial &B,Polynomial &R)
{
Node* a=front->next;
Node* b=B.front->next;
Node* r=R.front;
while(1)
{
r->next=new Node;
r=r->next;
r->next=NULL;
r->data=a->data;
if(a->next)
a=a->next;
else
break;
}
while(1)
{
r->next=new Node;
r=r->next;
r->next=NULL;
r->data=b->data;
if(b->next)
b=b->next;
else
break;
}
R.Row();
}
int main()
{
Node *p=new Node;
Node *q=new Node;
Node *r=new Node;
Polynomial<double> A(p); //操作多项式A
Polynomial<double> B(q); //操作多项式B
Polynomial<double> R(r); //操作多项式R(存储结果)
int m=0;
int n=0;
cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl;
cin>>m;
A.createLink(m);
cout<<"请输入你要运算的第二个一元多项式的项数:"<<endl;
cin>>n;
B.createLink(n);
if(!m||!n)
{
cout<<"您的多项式创建有误,请重新选择……"<<endl; //异常(以下省略)
}
A.Plus(B,R);
cout<<"相加的两个一元多项式为:"<<endl;
A.Print();
B.Print();
cout<<"相加后的结果为:"<<endl;
R.Print();
}
Polynomial addition Operation using C++
最新推荐文章于 2024-04-04 23:42:00 发布