这个ADT可以存储多项式系数,并进行相加,相乘等计算。
这个是用数组实现的版本。
头文件代码:
#ifndef POLYNOMIAL_H_INCLUDED
#define POLYNOMIAL_H_INCLUDED
#define MaxDegree 100
struct P
{
int CoeffArray[MaxDegree + 1];
int HighPower;
};
typedef struct P * Polynomial;
#endif // POLYNOMIAL_H_INCLUDED
实现源码:
#include "polynomial.h"
#include <stdio.h>
#include <stdlib.h>
int Max(int a,int b)
{
return a > b? a:b;
}
void Error(char * e)
{
}
void ZeroPolynomial(Polynomial Poly)
{
int i;
for( i = 0; i <= MaxDegree; i++)
Poly->CoeffArray[i] = 0;
Poly->HighPower = 0;
}
void AddPolynomial(const Polynomial Poly1,const Polynomial Poly2,Polynomial PolySum)
{
int i;
ZeroPolynomial(PolySum);
PolySum->HighPower = Max(Poly1->HighPower,Poly2->HighPower);
for( i = PolySum->HighPower; i >= 0; i--)
PolySum->CoeffArray[i] = Poly1->CoeffArray[i] + Poly2->CoeffArray[i];
// printf("%d ",PolySum->HighPower);
}
void MultPolynomial(const Polynomial Poly1,const Polynomial Poly2,const Polynomial PolyProd)
{
int i,j;
ZeroPolynomial(PolyProd);
PolyProd->HighPower = Poly1->HighPower + Poly2->HighPower;
if( PolyProd->HighPower > MaxDegree)
Error("Exceeded array size");
else
for(i = 0; i <= Poly1->HighPower; i++)
for(j = 0; j <= Poly2->HighPower; j++)
PolyProd->CoeffArray[i + j] += Poly1->CoeffArray[i]*Poly2->CoeffArray[j];
}
int main()
{
Polynomial a;
a = malloc(sizeof(struct P));
ZeroPolynomial(a);
a -> HighPower = 4;
int i;
for(i = 0; i < 5 ; i++)
{
// scanf("%d",(a->CoeffArray)[i]);
a->CoeffArray[i] = i;
}
Polynomial b;
b = malloc(sizeof(struct P));
ZeroPolynomial(b);
b -> HighPower = 4;
for(i = 0; i < 5 ; i++)
{
// scanf("%d",(b->CoeffArray)[i]);
b->CoeffArray[i] = i;
}
Polynomial sum;
sum = malloc(sizeof(struct P));
// AddPolynomial(a,b,sum);
// for(i = 0; i < 5 ; i++)
// printf("%d ",sum->CoeffArray[i]);
MultPolynomial(a,b,sum);
for(i = 0; i < a->HighPower+b->HighPower+1 ; i++)
printf("%d ",sum->CoeffArray[i]);
}
后面也是加了一个main函数来测试一下。
用数组实现的话,当各项系数比较紧密时效果比较好,但比如2x+3x^200+4x^2000这种多项式的话,浪费的空间就太大了,不过可以试着可以用表来实现。
注:代码改编自《数据结构与算法分析》第二版