表达式求解

//数据结构 实验一
#include
using namespace std;

struct unit
{
	float coef;  // 系数
	int expn;    // 指数
};
typedef struct polynomial
{
	unit e;
	polynomial *next;
	polynomial *head;
}*P;

int cmp(unit a,unit b);
void CreatePolyn(P &p,int m);
void print(P &ha);
void AddPolyn(P &Pa,P &Pb);

int main()
{
	P Pa,Pb;
	int m;
	cout<<"输入表达式Pa的项数:"<<endl;
	cin>>m;
	cout<<"输入表达式Pa的各项(按指数的从大到小的顺序):"<<endl;
	CreatePolyn(Pa,m);
	cout<<"输入表达式Pb的项数:"<<endl;
	cin>>m;
	cout<<"输入表达式Pb的各项(按指数的从大到小的顺序):"<<endl;
	CreatePolyn(Pb,m);
	AddPolyn(Pa,Pb);
	cout<<"结果如下:"<<endl;
	print(Pa);
}
int cmp(unit a,unit b)
{
	if(a.expn > b.expn)
		return -1;
	else if(a.expn == b.expn)
		return 0;
	else if(a.expn < b.expn)
		return 1;
}
void CreatePolyn(P &p,int m)
{
	p = new polynomial;
	p->next = NULL;
	p->head = p;
	p->e.coef = 0.0;
	p->e.expn = -1;
	int i;
	P now;
	for (i = 1;i <= m;i++)
	{
		float coef;
		int expn;
		cin>>coef>>expn;
		P s;
		s = new polynomial;
		s->e.coef = coef;
		s->e.expn = expn;
		if(i==1)
		{
			s->next= p->next;
			p->next= s;
		}
		else
		{
			s->next= now->next;
			now->next = s;
		}
		s->head = p;
		now = s;
		
	}
}
void print(P &ha)
{
	for(P i =ha->head->next;i;i = i->next)
	{
		if(!i->next)
		{
			cout<<i->e.coef<<""<<i->e.expn<<endl;
			break;
		}
		cout<<i->e.coef<<""<<i->e.expn<<",";
	}
}
void AddPolyn(P &Pa,P &Pb)
{
	P ha,hb,qa,qb;
	unit a,b;
	ha = Pa->head;
	hb = Pb->head;
	qa = Pa->next;
	qb = Pb->next;
	while(qa && qb)
	{
		float sum;
		a = qa->e;
		b = qb->e;
		switch(cmp(a,b))
		{
		case -1:   //a > b
			ha = qa;
			qa = qa->next;
			break;
		case 0:
			sum = a.coef + b.coef;
			if(sum != 0.0)
			{
				qa->e.coef = sum;
				ha = qa;
			}
			else
			{
				//删除PA中当前结点
				ha->next = qa->next;
				//释放空间
				delete qa;
			}
			hb->next = qb->next;
			delete qb;
			
			qb = hb->next;
			qa = ha->next;
			break;
		case 1:
			hb->next = qb->next;
			
			qb->next = ha->next;
			ha->next = qb;
			
			qb = hb->next;
			ha = ha->next;
			break;
		}
	}
	if(Pb->head->next)
		ha->next = qb;//链接剩余节点
	delete hb;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值