数据结构--基于天勤--多项式

/*--------------------------------
顺序存储结构 直接表示 多项式非零项
2018.10.21 完成


--------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#define MAX 100

typedef struct {
	double coef;//系数
	int expon;//指数
}polynomial;
/*------【开始】多项式函数声明------*/

void zero(polynomial *poly);
int isZero(polynomial *poly);
void printPoly(polynomial *poly);
void sortPoly(polynomial *poly);
void insert(polynomial *poly, double coef, int expon);
void removePoly(polynomial *poly, int expon);
void addPoly(polynomial *poly1, polynomial *poly2, polynomial *poly);
double returnCoef(polynomial *poly, int expon);
int returnMaxExpon(polynomial *poly);
void singleMult(polynomial *poly, double coef, int expon);
void doubleMult(polynomial *poly1, polynomial *poly2, polynomial *poly);

/*------【结束】多项式函数声明------*/
//【正常】排序多项式
void sortPoly(polynomial *poly)
{
	int temp1 = 0;
	double temp2 = 0;
	//系数从大到小--冒泡排序 多项式的每一项


	for (int i = 0; i <MAX; i++)
		for (int j = 1; j<MAX-i; j++)
		{
			if (poly[j].expon > poly[j-1].expon)
			{
				//Exchange value of poly[j], poly[j - 1]
				//交换系数
				temp2 = poly[j].coef;
				poly[j].coef = poly[j - 1].coef;
				poly[j-1].coef = temp2;
				

				//交换指数
				temp1 = poly[j].expon;
				poly[j].expon = poly[j - 1].expon;
				poly[j-1].expon = temp1;
				

			}
		}
}
//【正常】多项式中插入某一项
void insert(polynomial *poly, double coef, int expon)
{
	
	//插入操作
	for (int i = 0; i < MAX ; i++)
	{
		//先看能不能合并同类项
		if (poly[i].coef != 0 && poly[i].expon == expon)
		{
			poly[i].coef = poly[i].coef + coef;
			break;//能够合并同类项,合并后退出
			      //要注意程序的健壮性,否则可能出现意料之外的结果,逻辑要清晰。
		}

		//如果不能,插入到最后一项
		else if (poly[i].coef == 0  )
		{
			poly[i].coef = coef;
			poly[i].expon = expon;
			break;
		}
	}
	//再排序多项式
	sortPoly(poly);
}
//【正常】删除多项式中的某一项
void removePoly(polynomial *poly, int expon)
{
	//先将要删除的 位置coef expon全置0
	for (int i = 0; i < MAX; i++)
	{
		if (poly[i].expon == expon)
		{
			poly[i].expon = 0;
			poly[i].coef = 0;
			//printf("%lfx^%d\n", poly[i].coef, poly[i].expon);
			//break;
		}
		if (poly[i].expon == 0 && poly[i].coef != 0)
		{
			insert(poly, poly[i].coef, poly[i].expon);
		}
	}

	//再排序多项式
	sortPoly(poly);
}
//【正常】多项式1 + 多项式2 --->多项式
void addPoly(polynomial *poly1, polynomial *poly2, polynomial *poly)
{
	//【正常】把poly1的每一项插入poly
	for (int i = 0; i < MAX && poly1[i].coef != 0; i++)
        insert(poly, poly1[i].coef, poly1[i].expon);


	//【正常】把poly2的每一项插入poly
	for (int i = 0; i < MAX && poly2[i].coef != 0; i++)
		insert(poly, poly2[i].coef, poly2[i].expon);


}
//【正常】初始化多项式
void zero(polynomial *poly)
{
	for (int i = 0; i < MAX; i++)
	{
		poly[i].coef = 0; //系数
		poly[i].expon = 0; //指数
	}
}

//【正常】判断多项式是否为0 是返回1  不是返回0
int isZero(polynomial *poly)
{
	for (int i = 0; i < MAX; i++)
	{
		//只要系数有一项 为非0 说明多项式不为0
		if (poly[i].coef != 0)return 1;
		else return 0;
	}
	return 1;
}
//【正常】如果指数expon在多项式里面,返回他的系数coef,否则返回0
double returnCoef(polynomial *poly, int expon)
{
	for (int i = 0; i < MAX; i++)
	{
		if (poly[i].expon == expon)return poly[i].coef;
	}
	return 0;
}

//【正常】返回多项式中最大的指数
int returnMaxExpon(polynomial *poly)
{
	int maxExpon = poly[0].expon;
	/*
	for (int i = 0; i < MAX; i++)
	{
		maxExpon = poly[i].expon;
		if (i == 0)continue;
		if (poly[i].expon > maxExpon)maxExpon = poly[i].expon;
	}
	*/
	return maxExpon;
}
//【正常】打印多项式
void printPoly(polynomial *poly)
{
	//打印有效项
	for (int i = 0; i < MAX && poly[i].coef != 0; i++)
	{
		//不是常数项
		if (poly[i].expon != 0)
		{
			if (poly[i + 1].coef != 0)//后面还有项
				printf("%0.0lfx^%d+", poly[i].coef, poly[i].expon);
			else                 //后面没有项
				printf("%0.0lfx^%d", poly[i].coef, poly[i].expon);

		}
		//是常数项
		else
		{
			printf("%0.0lf", poly[i].coef); break;
		}


	}
}
//【正常】 单乘:多项式 * 某项
void singleMult(polynomial *poly, double coef, int expon)
{
	for (int i = 0; i < MAX; i++)
	{
		poly[i].coef = poly[i].coef * coef;
		poly[i].expon = poly[i].expon + expon;
	}
}

//【正常】多乘:多项式1 * 多项式2 ---> 多项式
void doubleMult(polynomial *poly1, polynomial *poly2, polynomial *poly)
{

	//多乘实现  只插入非零项的乘积
	for (int k = 0; k <MAX; k++)
	for (int j = 0; j <MAX; j++)
	{
		insert(poly, poly1[k].coef * poly2[j].coef, poly1[k].expon + poly2[j].expon);
	}

}
int main()
{
	polynomial poly1[MAX] , poly2[MAX], poly[MAX];

	zero(poly1);
	zero(poly2);
	zero(poly);

	printf("Poly1:");
	insert(poly1, 3, 20);
	insert(poly1, 2, 5);
	insert(poly1, 4, 0);
	printPoly(poly1); printf("\n");

	printf("Poly2:");
	insert(poly2, 3,4);
	insert(poly2, 2, 3);
	insert(poly2, 3, 2);
	insert(poly2, 1, 0);
	printPoly(poly2); printf("\n");

	addPoly(poly1, poly2, poly);
	printf("Poly1 + Poly2:");
	printPoly(poly); printf("\n");

	//--------------------------------------------------------
	printf("-----------------");
	printf("-----------------");
	printf("-----------------\n");
	//--------------------------------------------------------

	zero(poly1);
	zero(poly2);
	zero(poly);

	printf("Poly1:");
	insert(poly1, 3, 20);
	insert(poly1, 2, 5);
	insert(poly1, 4, 0);
	printPoly(poly1); printf("\n");

	printf("Poly2:");
	insert(poly2, 3, 4);
	insert(poly2, 2, 3);
	insert(poly2, 3, 2);
	insert(poly2, 1, 0);
	printPoly(poly2); printf("\n");

	doubleMult(poly1, poly2, poly);
	printf("Poly1 * Poly2:");
	printPoly(poly); printf("\n");
	
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值