用带头结点的单向链表实现多项式乘法
输入格式限制:
例如:5x2+5x+5写作:5x2 5x1 5x0[回车]
-时间复杂度略高,还有各种细节可以优化
-并未使用完整的链表体系(仅用了一部分函数)
-c++刚入门,之前一直用的c,写的比较乱
以下为完整代码:
#include <iostream>
using namespace std;
typedef struct POLYNOMIAL{
int ratio;
int exp;
struct POLYNOMIAL *next;
} polynomial;
int initpolynomial(polynomial &a)
{
a.next=NULL;
}
int GetPolyExp(polynomial a,int i,int &exp)
{
int j;
polynomial *temp=&a;
for(j=1;j<i&&temp!=NULL;j++)
{
temp=temp->next;
}
if(temp==NULL||j>i) return 0;
else
{
exp=temp->exp;
return 1;
}
}
int GetPolyRatio(polynomial a,int i,int &ratio)
{
int j;
polynomial *temp=&a;
for(j=1;j<i&&temp!=NULL;j++)
{
temp=temp->next;
}
if(temp==NULL||j>i) return 0;
else
{
ratio=temp->ratio;
return 1;
}
}
int insertnode(polynomial &c,int i,int ratio,int exp)
{
int j;
polynomial *temp=&c;
polynomial *temp2=(polynomial*)malloc(sizeof(polynomial));
for(j=1;j<i-1&&temp->next!=NULL;j++,temp=temp->next) { }
if(j!=i-1) return 0;
temp2->next=temp->next;
temp->next=temp2;
temp=temp->next;
temp->exp=exp;
temp->ratio=ratio;
return 1;
}
void CopyPolyn(polynomial c,polynomial &a)
{
polynomial *tempc=c.next,*tempa=&a;
while(tempc!=NULL)
{
tempa->next=(polynomial*)malloc(sizeof(polynomial));
tempa=tempa->next;
tempa->exp=tempc->exp;
tempa->ratio=tempc->ratio;
tempc=tempc->next;
}
tempa->next=NULL;
return ;
}
void freepolynomial(polynomial a)
{
polynomial *temp=a.next,*deletenode;
while(temp!=NULL)
{
deletenode=temp;
temp=temp->next;
free(deletenode);
}
return ;
}
void inputpolynomial(polynomial &a)
{
int exp,ratio,i=1;
char flag;
do
{
i++;
scanf("%dx%d%c",&ratio,&exp,&flag);
insertnode(a,i,ratio,exp);
}while(flag!='\n');
}
void printpolynomial(polynomial &a)
{
polynomial *temp=a.next;
int flag=0;
while(temp!=NULL)
{
if(temp->ratio!=0)
{
if(flag)
printf("%c%dx^%d",(temp->ratio>0?'+':'-'),(int)fabs(temp->ratio),temp->exp,(temp->next==NULL)?'\n':'+');
else printf("%dx^%d",temp->ratio,temp->exp,(temp->next==NULL)?'\n':'+');
}
temp=temp->next;
flag++;
}
return ;
}
int AddRatio(polynomial &c,int i,int ratio)
{
int j;
polynomial *temp=&c;
for(j=1;j<i&&temp!=NULL;j++)
{
temp=temp->next;
}
if(temp==NULL||j>i) return 0;
else
{
temp->ratio+=ratio;
return 1;
}
}
void Multionce(int ratioa,int ratiob,int expa,int expb,polynomial &c) //计算某两项乘积
{
int exp=expa+expb,i,expc=-1;
for(i=2;GetPolyExp(c,i,expc)&&expc>=exp;i++)
{
if(expc==exp) //出现多项的指数相同,系数相加即可
{
AddRatio(c,i,ratioa*ratiob);
break;
}
}
if(expc!=exp) insertnode(c,i,ratioa*ratiob,expa+expb); //暂时无法合并的一项,新插入一个节点存储
return ;
}
void MultiPolyn(polynomial &a,polynomial &b) //计算a,b两个多项式乘积,结果存入a
{
polynomial c; //c为临时多项式,暂存结果
initpolynomial(c);
int i,j,expa,expb,ratioa,ratiob; //i,j为循环控制变量,expa,expb存放指数,ratioa,ratiob存放系数
for(i=2;GetPolyExp(a,i,expa);i++) //获取多项式a的第i项的指数,存在expa中,若不存在第i项返回0,否则返回1
{
GetPolyRatio(a,i,ratioa); //获取多项式a的第i项的系数,存在ratioa中,若不存在第i项返回0,否则返回1
for(j=2;GetPolyExp(b,j,expb);j++)
{
GetPolyRatio(b,j,ratiob);
Multionce(ratioa,ratiob,expa,expb,c); //计算某两项的乘积,并且存进临时多项式c
}
}
freepolynomial(a); //清空a,腾出地方放结果
CopyPolyn(c,a); //将临时多项式c的结果复制给a
freepolynomial(c); //free临时多项式
return ;
}
int main()
{
polynomial a,b;
initpolynomial(a);
initpolynomial(b);
inputpolynomial(a);
inputpolynomial(b);
MultiPolyn(a,b);
printpolynomial(a);
freepolynomial(a);
freepolynomial(b);
return 0;
}