//............polyn.h
#ifndef _POLYN_H
#define _POLYN_H
#include<iostream>
#include<assert.h>
using namespace std;
typedef struct PolynNode
{
float coef;
int expn;
struct PolynNode *link;
}PolynNode;
typedef PolynNode* Polyn;
int _Compare(Polyn pa,Polyn pb);
void _insert(Polyn &pn, PolynNode *s);
void InitPolyn(Polyn &pn);
void CreatePolyn(Polyn &pn, int m);
void ShowPolyn(Polyn pn);
Polyn PolynAdd(Polyn pa, Polyn pb);
Polyn PolynSub(Polyn pa, Polyn pb);
Polyn PolynMul(Polyn pa, Polyn pb);
#endif
//...........Polyn.cpp
#include"Polyn.h"
int _Compare(Polyn pa,Polyn pb) //比较函数
{
if(pa==NULL&&pb==NULL) //两者相等 返回0
return 0;
else if(pa!=NULL&&pb==NULL) //pa比pb大,返回1
return 1;
else if(pa==NULL&&pb!=NULL)
return -1;
{ //两者都不空的情况下比较指数
if(pa->expn >pb->expn ) //pa的指数大于Pb的指数
return 1;
else if(pa->expn ==pb->expn )
return 0;
else
return -1;
}
}
void _insert(Polyn &pn, PolynNode *s) //将多项式按指数幂大小排序
{
if(s->coef == 0)
{
free(s);
s = NULL;
}
else //如果系数不为0
{
if(pn == NULL)
{
pn = s;
return;
}
PolynNode *p = pn;
PolynNode *q = NULL;
while(p!=NULL && p->expn>s->expn)
{
q = p; //p往后走
p = p->link;
}
if(p !=NULL&&p->expn <s->expn ) //
{
if(q==NULL)
{
s->link = p;
pn=s; //pn是整个多项式的头结点
}
else
{
s->link =p;
q->link =s;
}
}
else if(p!=NULL && p->expn == s->expn)
{
p->coef += s->coef;
if(p->coef == 0)
{
q->link = p->link;
free(p);
}
free(s);
s = NULL;
}
else
{
q->link = s;
}
}
}
void InitPolyn(Polyn &pn)
{
pn = NULL;
}
void CreatePolyn(Polyn &pn,int m)
{
for(int i=1; i<=m; ++i)
{
PolynNode *s = (PolynNode*)malloc(sizeof(PolynNode));
assert(s != NULL);
s->link = NULL;
cout<<"请输入第"<<i<<"项的系数和指数:>";
cin>>s->coef>>s->expn;
_insert(pn, s);
}
}
void ShowPolyn(Polyn pn)
{
PolynNode *p = pn ;
bool first=true;
while(p != NULL)
{
if(p->coef >0&&!first) //不是第一个输出的,就输出+
{
cout<<"+";
}
if(p->expn >1)
{
cout<<p->coef <<"x^"<<p->expn ;
}
else if(p->expn ==1)
{
cout<<p->coef <<"x";
}
else
{
cout<<p->coef ;
}
p = p->link;
first=false; //之后first肯定不是第一个
}
cout<<endl;
}
Polyn PolynAdd(Polyn pa, Polyn pb)
{
if(pa==NULL&&pb==NULL)
return NULL;
if(pa!=NULL&&pb==NULL)
return pa;
else if(pa==NULL&&pb!=NULL)
return pb;
Polyn pn=NULL;
while(pa!=NULL||pb!=NULL) //当两个多项式都不为空的时候
{
PolynNode *s=(PolynNode*)malloc(sizeof(PolynNode)); //申请结点
assert(s!=NULL);
s->link=NULL;
int res=_Compare(pa,pb);
switch(res)
{
case 1: //pa比pb大
s->coef =pa->coef ;
s->expn =pa->expn ;
pa=pa->link ; //pa往后走
break;
case 0:
s->coef =pa->coef +pa->coef ;
s->expn =pa->expn ;
pa=pa->link ;
pb=pb->link ;
break;
case -1:
s->coef =pb->coef ;
s->expn =pb->expn ;
pb=pb->link ;
break;
}
_insert(pn,s); //将值插入
}
return pn;
}
Polyn PolynSub(Polyn pa, Polyn pb) // 多项式的减法运算
{
Polyn pn=NULL;
PolynNode *p=pb;
while(p!=NULL)
{
p->coef *=-1;
p=p->link ;
}
pn=PolynAdd(pa,pb);
p=pb;
while(p!=NULL)
{
p->coef *=-1;
p=p->link ;
}
return pn;
}
Polyn PolynMul(Polyn pa, Polyn pb) //多项式的乘法
{
Polyn pn=NULL;
PolynNode *p;
while(pa!=NULL)
{
p==pb;
while(p!=NULL)
{
PolynNode *s=(PolynNode*)malloc(sizeof(PolynNode));
assert(s!=NULL);
s->link =NULL;
s->coef =pa->coef *p->coef ;
s->expn =pa->expn +p->expn ;
_insert(pn,s);
p=p->link ;
}
pa=pa->link ;
}
return pn;
}
//.........main.cpp
#include<iostream>
#include"Polyn.h"
using namespace std;
void main()
{
Polyn pa;
Polyn pb;
Polyn pc;
InitPolyn(pa);
InitPolyn(pb);
InitPolyn(pc);
int m;
int select = 1;
while(select)
{
cout<<"***********************************"<<endl;
cout<<"*[1]创建多项式pa [2]创建多项式pb *"<<endl;
cout<<"*[3]显示多项式pa [4]显示多项式pb *"<<endl;
cout<<"*[5]多项式相加 [6]多项式相减 *"<<endl;
cout<<"*[7]多项式相乘 [0]退出系统 *"<<endl;
cout<<"***********************************"<<endl;
cout<<"请选择:>";
cin>>select;
switch(select)
{
case 1:
cout<<"请输入多项式的项数:>";
cin>>m;
CreatePolyn(pa, m);
break;
case 2:
cout<<"请输入多项式的项数:>";
cin>>m;
CreatePolyn(pb, m);
break;
case 3:
cout<<"pa = ";
ShowPolyn(pa);
cout<<endl;
break;
case 4:
cout<<"pb=";
ShowPolyn(pb);
cout<<endl;
break;
case 5:
pc = PolynAdd(pa, pb);
cout<<"pc=";
ShowPolyn(pc);
break;
}
}
}
一元多项式的加减乘运算
最新推荐文章于 2022-05-04 19:44:13 发布