应用顺序表计算多项式,把多项式存储在顺序表里,顺序表的下标对应多项式的系数
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
#define OK 1
#define ERROR -1
typedef int Status;
typedef int Elemtype;
多项式的结构体
typedef struct polynomial
{
float coef;//系数
int expn;//指数
}Polyn;
顺序表的的结构体
typedef struct SqList
{
Polyn *array;
int length;
}SqList;
顺序线性表初始化
Status Init_SqList(SqList *L)
{
L->array=(Polyn *)malloc(MAX_SIZE * sizeof(Polyn)) ;
if(!L->array)
return ERROR;
else
{
L->length = 0;
return OK;
}
}
创建一个多项式
void CreatPolyn(SqList *L)
{
int i;//循环变量
int m;//多项式的项数
SqList *q;
q = L;
printf("请输入多项式数:");
scanf("%d", &m);
if(m <= 0 || m > MAX_SIZE)
{
printf("Item unsecification!\n");
}
for(i = 0; i < m; i++)
{
float c;//多项式的系数
printf("请输入%d次项的系数:", i);
scanf("%f", &c);
q->array[i].coef = c;
q->array[i].expn = i;//顺序表达下表和指数是相同的,所以把下标赋给指数
q->length++;
}
if(q->length == m)
printf("创建成功\n");
}
求多项式的项数
Status PolynLength(SqList *L)
{
int length = 0;
int i;
SqList *p;
p = L;
for(i = 0; i < p->length; i++)
{
length++;
}
return length;
}
多项式相加
Status AddPolyn(SqList *L1, SqList *L2, SqList *L3)
{ //L1+L2=L3
int i;//循环变量
SqList *p;
SqList *q;
SqList *r;
p = L1;
q = L2;
r = L3;
//若L1和L2不一样长,先把前面的部分相加
for(i = 0; i < p->length && i < q->length; i++)
{
r->array[i].coef = p->array[i].coef + q->array[i].coef;
r->array[i].expn = p->array[i].expn;
r->length++;
}
//把长的直接加在L3后面
if((i == p->length) && (i != q->length))
{
int j;
for(j = i; j < q->length; j++)
{
r->array[j].coef = q->array[j].coef;
r->array[j].expn = q->array[j].expn;
r->length++;
}
}
else if((i != p->length) && (i == q->length))
{
int j;
for(j = i; j < p->length; j++)
{
r->array[j].coef = p->array[j].coef;
r->array[j].expn = p->array[j].expn;
r->length++;
}
}
printf("项数为:%d\n", r->length);
return OK;
}
两个多项式(L1-L2)相减
Status SubractPolyn(SqList *L1, SqList *L2, SqList *L3)
{
int i;//循环变量
SqList *p;
SqList *q;
SqList *r;
p = L1;
q = L2;
r = L3;
//若L1和L2不一样长,先把前面的部分相减
for(i = 0; i < p->length && i < q->length; i++)
{
r->array[i].coef = p->array[i].coef - q->array[i].coef;
r->array[i].expn = p->array[i].expn;
r->length++;
}
//两个多项式不一样长
//若被减数多项式长,则把剩下的直接加在L3后面
//若减数多项式长,则把剩下的变成负的加在L3后面
if((i == p->length) && (i != q->length))
{
int j;
for(j = i; j < q->length; j++)
{
r->array[j].coef = -(q->array[j].coef);
r->array[j].expn = q->array[j].expn;
r->length++;
}
}
else if((i != p->length) && (i == q->length))
{
int j;
for(j = i; j < p->length; j++)
{
r->array[j].coef = p->array[j].coef;
r->array[j].expn = p->array[j].expn;
r->length++;
}
}
return OK;
}
两个多项式相乘
Status MultiplyPolyn(SqList *L1, SqList *L2, SqList *L4)
{ //L1*L2 = L4
int i;
int j;
SqList *p;
SqList *q;
SqList *r;
p = L1;
q = L2;
//根据L1和L2相乘后的项数给L4申请空间
//若L1有n项 L2有m项 则L4有(n-1)+(m-1)+ 1项
L4->array=(Polyn *)malloc(((p->length - 1) + (q->length - 1) + 1) * sizeof(Polyn)) ;
if(!L4->array)
printf("初始化失败!\n");
else
{
//L4的长度为:(n-1)+(m-1)+ 1
L4->length = (p->length - 1) + (q->length - 1) + 1;
printf("初始化成功!\n");
printf("长度为:%d\n", L4->length);
}
r = L4;
//先把L4所有的系数和指数赋为0
for(i = 0; i < L4->length; i++)
{
r->array[i].coef = 0;
r->array[i].expn = 0;
}
//系数相乘,指数相加,在和计算出来的位置上原有的系数相加
for(i = 0; i < p->length; i++)
{
for(j = 0; j < q->length; j++)
{
int a = p->array[i].expn + q->array[j].expn;
r->array[a].expn = a;
r->array[a].coef = p->array[i].coef * q->array[j].coef + r->array[a].coef;
}
}
return OK;
}
打印多项式
void OutPut(SqList *L)//打印多项式
{
SqList *q;
int i;
int j;
q = L;
printf("P = ");
for(i = 0; i < q->length; i++)
{
if(i == 0)//若是常数项
{
if(!q->array[i].coef == 0)//不为0,打印
{
printf("%f", q->array[i].coef);
for(j = i + 1; j < q->length; j++)
{
if((q->array[j].coef != 0) && (q->array[j].coef > 0))
{
printf(" + ");
break;
}
else if((q->array[j].coef != 0) && (q->array[j].coef < 0))
{
printf(" ");
break;
}
}
}
}
else//若不是常数项
{
if(!q->array[i].coef == 0)//系数不为0 打印
{
printf("%fX^", q->array[i].coef);
printf("%d", q->array[i].expn);
for(j = i + 1; j < q->length; j++)
{
if((q->array[j].coef != 0) && (q->array[j].coef > 0))
{
printf(" + ");
break;
}
else if((q->array[j].coef != 0) && (q->array[j].coef < 0))
{
printf(" ");
break;
}
}
}
}
}
printf("\n");
}
主方法
int main()
{
int i;
int res1 = 0;//L1初始化返回结果
int res2 = 0;//L2初始化返回结果
int res3 = 0;//L3初始化返回结果
int res4 = 0;//L4初始化返回结果
int res5 = 0;//L1+L2返回的结果
int res6 = 0;//L1-L2的结果
int res7 = 0;//L1*L2的结果
SqList L1;//第一个多项式
SqList L2;//第二个多项式
SqList L3;//相加后的多项式
SqList L4;//相减后的多项式
SqList L5;//L1*L2后的多项式
res1 = Init_SqList(&L1);//初始化L1
res2 = Init_SqList(&L2);//初始化L2
res3 = Init_SqList(&L3);//初始化L3
res4 = Init_SqList(&L4);//初始化L4
printf("%4d%4d%4d%4d\n", res1, res2, res3, res4);
CreatPolyn(&L1);//创建多项式L1
OutPut(&L1);//打印多项式L1
printf("--------------------------------\n");
CreatPolyn(&L2);//创建多项式L2
OutPut(&L2);//打印多项式L2
printf("*******************************\n");
printf("L1为:");
OutPut(&L1);
printf("\n");
printf("L2为:");
OutPut(&L2);
printf("\n");
printf("************L1+L2后************\n");//多项式L1+L2赋值给L3
printf("\n");
res5 = AddPolyn(&L1, &L2, &L3);
OutPut(&L3);
printf("\n");
printf("%d\n", res5);
printf("\n");
printf("************L1-L2后************\n");
printf("\n");
res6 = SubractPolyn(&L1, &L2, &L4);
OutPut(&L4);
printf("\n");
printf("%d\n", res6);
printf("\n");
printf("************L1*L2后************\n");
printf("\n");
res7 = MultiplyPolyn(&L1, &L2, &L5);
for(i = 0; i < L5.length; i++)
{
printf("系数:%4f | 指数:%4d\n", L5.array[i].coef, L5.array[i].expn);
}
OutPut(&L5);
printf("\n");
printf("%d\n", res7);
return 0;
}
若有汉字的编译错误,请把汉字改成英文就OK了
运行结果: