用带头结点的单向链表实现多项式乘法

用带头结点的单向链表实现多项式乘法

输入格式限制:
例如: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;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值