您的位置:首页 > 理论基础 > 数据结构算法

一元多项式的加减乘运算

2017-02-10 14:53 405 查看
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)
return 0;
else if(pa!=NULL && pb==NULL)
return 1;
else if(pa==NULL && pb!=NULL)
return -1;
{
if(pa->expn > pb->expn)
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
{
if(pn == NULL)
{
pn = s;
return;
}
PolynNode *p = pn;
PolynNode *q = NULL;
while(p!=NULL && p->expn>s->expn)
{
q = p;
p = p->link;
}

if(p!=NULL && p->expn < s->expn)
{
if(q==NULL)
{
s->link = p;
pn = s;
}
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 &
4000
amp;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;
}
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:
s->coef = pa->coef;
s->expn = pa->expn;
pa = pa->link;
break;
case 0:
s->coef = pa->coef + pb->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;
}


PolynMain.cpp     //-----------------------------------------------Main源文件

#include"Polyn.h"

int _Compare(Polyn pa, Polyn pb)
{
if(pa==NULL && pb==NULL)
return 0;
else if(pa!=NULL && pb==NULL)
return 1;
else if(pa==NULL && pb!=NULL)
return -1;
{
if(pa->expn > pb->expn)
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
{
if(pn == NULL)
{
pn = s;
return;
}
PolynNode *p = pn;
PolynNode *q = NULL;
while(p!=NULL && p->expn>s->expn)
{
q = p;
p = p->link;
}

if(p!=NULL && p->expn < s->expn)
{
if(q==NULL)
{
s->link = p;
pn = s;
}
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;
}
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:
s->coef = pa->coef;
s->expn = pa->expn;
pa = pa->link;
break;
case 0:
s->coef = pa->coef + pb->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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息