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 &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;
}