/*--------------------------------
顺序存储结构 直接表示 多项式非零项
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;
}