/* This code doesn't really do much */ /* Thus I haven't bothered testing it */ #include "fatal.h" #define MaxDegree 100 static int Max( int A, int B ) { return A > B ? A : B; } /* START: fig3_18.txt */ typedef struct { int CoeffArray[ MaxDegree + 1 ]; int HighPower; } *Polynomial; /* END */ /* START: fig3_19.txt */ void ZeroPolynomial( Polynomial Poly ) { int i; for( i = 0; i <= MaxDegree; i++ ) Poly->CoeffArray[ i ] = 0; Poly->HighPower = 0; } /* END */ /* START: fig3_20.txt */ 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 ]; } /* END */ /* START: fig3_21.txt */ void MultPolynomial( const Polynomial Poly1, const Polynomial Poly2, 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 ]; } /* END */ #if 0 /* START: fig3_23.txt */ typedef struct Node *PtrToNode; struct Node { int Coefficient; int Exponent; PtrToNode Next; }; typedef PtrToNode Polynomial; /* Nodes sorted by exponent */ /* END */ #endif void PrintPoly( const Polynomial Q ) { int i; for( i = Q->HighPower; i > 0; i-- ) printf( "%dx^%d + ", Q->CoeffArray[ i ], i ); printf( "%d\n", Q->CoeffArray[ 0 ] ); } main( ) { Polynomial P, Q; P = malloc( sizeof( *P ) ); Q = malloc( sizeof( *Q ) ); P->HighPower = 1; P->CoeffArray[ 0 ] = 1; P->CoeffArray[ 1 ] = 1; MultPolynomial( P, P, Q ); MultPolynomial( Q, Q, P ); AddPolynomial( P, P, Q ); PrintPoly( Q ); return 0; }