最近在复习数据结构,发现一元多项式的表示和运算很适合用单链表来实现,因此写了一个c++类,代码贴上来与大家分享。
#include <iostream>
using namespace std;
struct polynode{
float xi;
int zhi;
polynode *next;
};
//一元多项式类
class polynomial{
public:
polynomial(){
head=new polynode;
head->next=NULL;
};
//~polynomial();
void createpoly();
void printpoly();
void polysort();
int polylength();
void addpoly(polynomial c);
void minuspoly(polynomial a);
void multiplypoly(polynomial b);
private:
polynode *head;
};
//创建一元多项式,输入项数和每项系指数建立链表
void polynomial::createpoly(){
int m;
cout<<"请输入多项式项数"<<endl;
cin>>m;
cout<<"请依次输入m项的系数和指数,以空格分割"<<endl;
/*
//数组的形式,还是不好
polynode *nodearray=new polynode[m];
head->next=nodearray;
for(int i=0;i++;i<m){
cin>>nodearray[i].xi>>nodearray[i].zhi;
if(i==m-1)
nodearray[i].next=NULL;
else
nodearray[i].next=&nodearray[i+1];
}
*/
//链式创建的形式,比较好
polynode *p1,*p2;
p1=head;
for(int i=0;i<m;i++){
p2=new polynode;
cin>>p2->xi;
cin>>p2->zhi;
p2->next=NULL;
p1->next=p2;
p1=p2;
}
}
//降幂表示多项式
void polynomial::printpoly(){
cout<<"此多项式是(降幂表示):"<<endl;
polysort();
if(polylength()==0)
cout<<0;
else{
for(polynode *p=head;p->next!=NULL;p=p->next){
if(p->next->xi>0&&p!=head)
cout<<"+";
if(p->next->xi!=1&&p->next->xi!=-1)
cout<<p->next->xi;
else if(p->next->xi==-1)
cout<<"-";
else if(p->next->xi==1&&p->next->zhi==0)
cout<<p->next->xi;
if(p->next->zhi!=1&&p->next->zhi!=0)
cout<<"x^"<<p->next->zhi;
else if(p->next->zhi==1)
cout<<"x";
}
}
cout<<endl;
}
//多项式按降幂排序
void polynomial::polysort(){
if(polylength()!=0){
polynode *p,*q=NULL;
float tp1;
int tp2;
while(q!=head->next->next){
for(p=head->next;p->next!=q;p=p->next){
if(p->next->zhi>p->zhi){
tp1=p->xi;
tp2=p->zhi;
p->xi=p->next->xi;
p->zhi=p->next->zhi;
p->next->xi=tp1;
p->next->zhi=tp2;
}
}
q=p;
}
}
}
//返回多项式的项数
int polynomial::polylength(){
int count=0;
polynode *p;
for(p=head->next;p!=NULL;p=p->next){
count++;
}
return count;
}
//本多项式加上一个多项式的结果替换原多项式,另一个加数销毁
void polynomial::addpoly(polynomial a){
polynode *p,*q,*n,*d;
q=head;
for(p=a.head->next;p!=NULL;p=p->next){
while(q->next!=NULL&&q->next->zhi>p->zhi){
q=q->next;
}
if(q->next!=NULL){
if(q->next->zhi==p->zhi){
if(q->next->xi+p->xi!=0){
q->next->xi=q->next->xi+p->xi;
q=q->next;
}
else{
d=q->next;
q->next=q->next->next;
delete(d);
}
}
else{
n=new polynode;
n->xi=p->xi;
n->zhi=p->zhi;
n->next=q->next;
q->next=n;
q=q->next;
}
}
else{
n=new polynode;
n->xi=p->xi;
n->zhi=p->zhi;
n->next=q->next;
q->next=n;
q=q->next;
}
}
for(p=a.head->next;p!=NULL;){
d=p;
p=p->next;
delete(d);
}
}
//本多项式减去一个多项式的结果替换原多项式,减数销毁
void polynomial::minuspoly(polynomial a){
polynode *p,*q,*n,*d;
q=head;
for(p=a.head->next;p!=NULL;p=p->next){
while(q->next!=NULL&&q->next->zhi>p->zhi){
q=q->next;
}
if(q->next!=NULL){
if(q->next->zhi==p->zhi){
if(q->next->xi-p->xi!=0){
q->next->xi=q->next->xi-p->xi;
q=q->next;
}
else{
d=q->next;
q->next=q->next->next;
delete(d);
}
}
else{
n=new polynode;
n->xi=-p->xi;
n->zhi=p->zhi;
n->next=q->next;
q->next=n;
q=q->next;
}
}
else{
n=new polynode;
n->xi=-p->xi;
n->zhi=p->zhi;
n->next=q->next;
q->next=n;
q=q->next;
}
}
for(p=a.head->next;p!=NULL;){
d=p;
p=p->next;
delete(d);
}
}
//本多项式乘以一个多项式的结果替换原多项式,另一个因子销毁
void polynomial::multiplypoly(polynomial a){
polynomial newd;
polynomial tmp;
polynode *p,*q,*tp,*d;
for(p=head->next;p!=NULL;p=p->next){
for(q=a.head->next;q!=NULL;q=q->next){
tp=new polynode;
tp->xi=(p->xi)*(q->xi);
tp->zhi=(p->zhi)+(q->zhi);
tp->next=NULL;
tmp.head->next=tp;
newd.addpoly(tmp);
}
}
for(p=head->next;p!=NULL;){
d=p;
p=p->next;
delete(d);
}
for(p=a.head->next;p!=NULL;){
d=p;
p=p->next;
delete(d);
}
head=newd.head;
}