您的位置:首页 > 其它

一元多项式的加减乘运算

2017-05-20 17:09 253 查看
//............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<
cec5
span class="hljs-subst">&&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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息