Skip to content

polynomial indeterminate

c
#define OVERFLOW -2
typedef struct {
   float  coef;       
   int    expn;       
} ElemType, Term;   

typedef struct {
   Term  *term;       
   int    termNum;    
} PolyStruct, *Poly;  

Poly allocPoly(int m) {  
   Poly Q;
   if (!(Q = (Poly)malloc(sizeof(*Q)))) exit(OVERFLOW);  
   if (!(Q->term = (Term*)malloc(m*sizeof(Term))))  
      exit(OVERFLOW);   
   return Q;            
}

Poly FreePoly(Poly P) {
   if (P) { free(P->term);   free(P); }
   return NULL;
}

Poly CreatePoly(Term ts[], int m) {  
   Poly P = allocPoly(m);   
   for (int i=0; i<m; i++) P->term[i] = ts[i];  
   P->termNum = m;   
   return P;
}
void PrintfPoly(Poly P) {  
   for (int i=0; i<P->termNum; i++) {             
      if (i==0) printf("%.2f", P->term[i].coef);  
      else {                                      
         if (P->term[i].coef>0.0) printf(" + ");
         else printf(" - ");
         printf("%.2f", fabs(P->term[i].coef));  
      } 
      if (P->term[i].expn>=1) printf("x");
      if (P->term[i].expn>1) printf("^%d", P->term[i].expn);  
   }
   printf("\n");
} 

int Compare(int a, int b) {  
  if (a < b) return -1;
  if (a > b) return  1;
  return 0;
}

Poly AddPolyP(Poly pa, Poly pb) {
    int i,j,k,pam,pbn;   
    float c;
    Term *pati, *pbtj, *pctk, *patm, *pbtn;
    
    pam = pa->termNum;   pbn = pb->termNum;
    
    Poly pc = allocPoly(pam + pbn);
    
    pati = pa->term;   patm = pati + pam;
    pbtj = pb->term;   pbtn = pbtj + pbn;  
    pctk = pc->term;   k = 0; 
    while (pati < patm && pbtj < pbtn) {
        switch (Compare(pati->expn, pbtj->expn)) {
            case -1: *pctk++ = *pati++;  k++;  break;
            case  1: *pctk++ = *pbtj++;  k++;  break; 
            case  0: c = pati->coef + pbtj->coef; 
                 if (c!=0) { 
                   pctk->expn = pati->expn;   pctk->coef = c;
                   pctk++;   k++;
                   }
                   pati++;   pbtj++;
        }
    }
    
    if (pati == patm) {
       j = pbtn-pbtj;   k += j;
       memcpy(pctk, pbtj, j*sizeof(Term));
       k += pbtn-pbtj;
    }
    
    if (pbtj == pbtn) {
        i = patm-pati;   k += i;
         memcpy(pctk, pati, i*sizeof(Term));

    }
    
    if (k < pam+pbn) {
         if (!(pc->term = (Term*)realloc(pc->term, k*sizeof(Term)))) return NULL;

    }
    
    pc->termNum = k;
    
    return pc;   
}


Poly AddPoly(Poly pa, Poly pb) {
   Poly pc;   int i=0, j=0, k=0;   float c;
   int pam = pa->termNum, pbn = pb->termNum;
   if (!(pc = allocPoly(pam+pbn))) return NULL;
   while (i < pam && j < pbn) {
      switch (Compare(pa->term[i].expn, pb->term[j].expn)) {
        case -1: pc->term[k++] = pa->term[i++];  break;
        case  1: pc->term[k++] = pb->term[j++];  break;
        case  0: c = pa->term[i].coef + pb->term[j].coef; 
            if (c!=0) {
               pc->term[k].expn = pa->term[i].expn;
               pc->term[k].coef = c;
               k++;
            }
             i++;   j++;   
       }
   
   }
   
   if (i == pam) {
        memcpy(pc->term+k, pb->term+j, (pbn-j)*sizeof(Term));   
        k += pbn-j;
   }
    if (j == pbn) {
        memcpy(pc->term+k, pa->term+i, (pam-i)*sizeof(Term));   
        k += pam-i; 
    }
    
    if (k < pam + pbn) {
       if (NULL == (pc->term = (Term*)realloc(pc->term, k*sizeof(Term)))) return NULL;
    }
    
    pc->termNum = k;
    
     return pc;  
}

持之苟有恒,久久自芬芳