一元多项式的加减乘运算

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值