Page 170, Exercise 7

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define FALSE 0
#define TRUE 1
#define COMPARE(x,y) ((x) < (y) ? -1 : (x) == (y) ? 0 : 1)
typedef struct PolyNode *PolyPointer;
	struct PolyNode	{
	  float coef;
	  int expon;
	  PolyPointer link;
	};
void attach(int, int, PolyPointer *);
PolyPointer GetNode();
void RetNode(PolyPointer);
void cerase(PolyPointer *);
PolyPointer av = NULL;
PolyPointer ReadPoly();
void PrintPoly(PolyPointer);
PolyPointer cpadd(PolyPointer, PolyPointer);
float evalPoly(float, PolyPointer);

int main()
{
   PolyPointer a,b,c;
    float x0;
  printf("Polynomial A: \n");
   a =  ReadPoly();
   printf("Polynomial B: \n");
   b =  ReadPoly();
   printf("Your polynomials are: \n");
   printf("Polynomial a: "); PrintPoly(a);
   printf("\nPolynomial b: "); PrintPoly(b);
   c = cpadd(a,b);
   printf("\n a+b = "); PrintPoly(c);
   printf("\n\nx0:");
   scanf("%f", &x0);
   printf("\nAt %f the polynomial is: %5.2f\n", x0, evalPoly(x0,a));
}


float evalPoly(float x0, PolyPointer ptr)
{/*evaluate the polynomial */
  PolyPointer c;
  float result = 0;
  for (c = ptr->link; c != ptr; c = c->link) {
      result = result + c->coef*pow(x0, c->expon);
	  printf("%f, %d\n", c->coef,c->expon);
  }
  return result;
}


PolyPointer ReadPoly()
{/*read in the polynomial */
  PolyPointer node,c;
  float coefficient;
  int exponent;

  node = GetNode();
  node->coef = -1.0;
  node->expon = -1;
  node->link = node;
  printf("Enter an exponent < 0 to quit: ");
  printf("\nCoefficient, Exponent: ");
  scanf("%f,%d",&coefficient,&exponent);
  while (exponent >= 0) {
     c = GetNode();
     c->coef =  coefficient; 
     c->expon = exponent;
     c->link = node->link;
     node->link = c;
     printf("Coefficient, Exponent: ");
     scanf("%f,%d",&coefficient,&exponent);
	}
  return node;
}

void PrintPoly(PolyPointer ptr)
{/*write out the polynomial */
  PolyPointer c;
  for (c = ptr->link; c != ptr; c = c->link)
      printf("<%5.2fx^%d>, ",c->coef,c->expon);
}

PolyPointer GetNode()
/* provide a node for use */
{
   PolyPointer node;
   if (!av)
      node = (PolyPointer)malloc(sizeof(struct PolyNode));
   else {
      node = av;
      av = av->link;
   }
   return node;
}


void attach(int coefficient, int exponent, PolyPointer *ptr)
{/* create a new node with coef = coefficient and expon = exponent,
    attach it to the node pointed to by ptr.  ptr is updated to point
    to this new node */
  PolyPointer node;
  node = GetNode();
  node->coef = coefficient;
  node->expon = exponent;
  (*ptr)->link = node;
  *ptr = node;
}


PolyPointer cpadd(PolyPointer a, PolyPointer b)
{/* polynomials a and b are singly linked lists, return
     a polynomial which is the sum of a and b */
  PolyPointer  startA, c, lastC;
  int num, done = FALSE; /* jump out of switch and do loop */
  startA = a;          /* record start of a */
  a = a->link;         /* skip head node for a and b*/
  b = b->link;

  c = GetNode();       /* get a head node for c */
  c->expon = -1;  c->coef = -1;
  lastC = c;
  do {
     switch (COMPARE(a->expon, b->expon)) {
       case -1: /* a->expon < b->expon */
		attach(b->coef,b->expon,&lastC);
		b=b->link;
		break;
       case 0:  /* a->expon = b->expon */
		if (startA == a)
		   done = TRUE;
		else {
		   num = a->coef + b->coef;
		   if (num) {
		     attach(num,a->expon,&lastC);
		     a = a->link;
		     b = b->link;
		   }
		  }
		  break;
	case 1:  /* a->expon > b->expon */
		 attach(a->coef,a->expon,&lastC);
		 a = a->link;
		 break;
      }
     } while (!done);
     lastC->link = c;
     return c;
}