polynomial multiplcation

use simple linked list ADT:

about the running time of polynode multiply2(const polynode p1,const polynode p2), assume size of p1 is M,size of p2 is N, the result should be:

M*N+2N+3N+4N+5N+…+(M-1)N=M*N+(M+1)*(M-1)*N/2=O(M2*N)

   1:  #include <stdio.h>
   2:  #include <stdlib.h>
   3:  struct node;
   4:  typedef struct node *ptr_to_node;
   5:  typedef ptr_to_node polynode;
   6:  struct node
   7:  {
   8:      int coefficient;
   9:      int exponent;
  10:      polynode next;
  11:  };
  12:  void duplicate_and_combine(polynode p1,const polynode p2);
  13:   
  14:  void print_poly(polynode p)
  15:  {
  16:      polynode c=p->next;
  17:      if(c==NULL)
  18:      {
  19:          printf("empty polynomial\n");
  20:          return;
  21:      }
  22:   
  23:      while(c->next!=NULL)
  24:      {
  25:          printf("%d*X(%d)+",c->coefficient,c->exponent);
  26:          c=c->next;
  27:      }
  28:      printf("%d*X(%d)\n",c->coefficient,c->exponent);
  29:  }
  30:   
  31:  void emptypoly(polynode p)
  32:  {
  33:      p->next=NULL;
  34:      p->coefficient=p->exponent=0;
  35:  }
  36:   
  37:  polynode create_newpoly()
  38:  {
  39:      polynode p=malloc(sizeof(struct node));
  40:      emptypoly(p);
  41:      return p;
  42:  }
  43:   
  44:  /*
  45:  link the second polynomial after the tail of first polynomial
  46:  no sorting, O(M+N)
  47:  */
  48:  polynode add_polynomial1(const polynode p1,const polynode p2)
  49:  {
  50:      polynode sum=create_newpoly();
  51:      duplicate_and_combine(sum,p1);
  52:      duplicate_and_combine(sum,p2);
  53:      return sum;
  54:  }
  55:   
  56:  /*
  57:  link the two polynomial step by step with power sort with asdending
  58:  assume the original two polynomial are already sorted and combined
  59:  O(M+N)
  60:  */
  61:  polynode add_polynomial2(const polynode p1, polynode p2)
  62:  {
  63:      polynode sum=create_newpoly();
  64:      polynode c1=p1->next;
  65:      polynode c2=p2->next;
  66:      polynode c3=sum;
  67:   
  68:      while(c1!=NULL && c2!=NULL)
  69:      {
  70:          c3->next=create_newpoly();
  71:          if(c1->exponent>c2->exponent)
  72:          {
  73:              c3->next->exponent=c1->exponent;
  74:              c3->next->coefficient=c1->coefficient;
  75:              c1=c1->next;
  76:          }
  77:          else if(c1->exponent==c2->exponent)
  78:          {
  79:              c3->next->exponent=c1->exponent;
  80:              c3->next->coefficient=c1->coefficient+c2->coefficient;
  81:              c1=c1->next;
  82:              c2=c2->next;
  83:          }
  84:          else
  85:          {
  86:              c3->next->exponent=c2->exponent;
  87:              c3->next->coefficient=c2->coefficient;
  88:              c2=c2->next;
  89:          }
  90:          c3=c3->next;
  91:      }
  92:   
  93:      polynode c4=NULL;
  94:      if(c1!=NULL)
  95:      {
  96:          c4=c1;
  97:      }
  98:      else if(c2!=NULL)
  99:      {
 100:          c4=c2;
 101:      }
 102:   
 103:      while(c4!=NULL)
 104:      {
 105:          c3->next=create_newpoly();
 106:          c3->next->exponent=c4->exponent;
 107:          c3->next->coefficient=c4->coefficient;
 108:          c4=c4->next;
 109:          c3=c3->next;
 110:      }
 111:   
 112:      return sum;
 113:  }
 114:   
 115:  /*
 116:  multiply two polynomials, no sorting
 117:  O(M*N)
 118:  */
 119:  polynode multiply1(const polynode p1,const polynode p2)
 120:  {
 121:      polynode res=create_newpoly();
 122:      polynode c1=p1->next;
 123:      polynode c3=res;
 124:   
 125:      while(c1!=NULL)
 126:      {
 127:          polynode c2=p2->next;
 128:          while(c2!=NULL)
 129:          {
 130:              c3->next=create_newpoly();
 131:              c3->next->coefficient=c1->coefficient*c2->coefficient;
 132:              c3->next->exponent=c1->exponent+c2->exponent;
 133:              c3=c3->next;
 134:              c2=c2->next;
 135:          }
 136:          c1=c1->next;
 137:      }
 138:      return res;
 139:  }
 140:   
 141:  /*
 142:  multiply two polynomials with exponent sorted output
 143:  assume the original two polynomials are in sorted order
 144:  O(M*M*N)
 145:  */
 146:  polynode multiply2(const polynode p1,const polynode p2)
 147:  {
 148:      polynode res=create_newpoly();
 149:      polynode c1=p1->next;
 150:   
 151:   
 152:      while(c1!=NULL)
 153:      {
 154:          polynode temp=create_newpoly();
 155:          polynode c2=p2->next;
 156:          polynode c3=temp;
 157:          while(c2!=NULL)
 158:          {
 159:              c3->next=create_newpoly();
 160:              c3->next->coefficient=c1->coefficient*c2->coefficient;
 161:              c3->next->exponent=c1->exponent+c2->exponent;
 162:              c3=c3->next;
 163:              c2=c2->next;
 164:          }
 165:   
 166:          res=add_polynomial2(res,temp);
 167:          c1=c1->next;
 168:      }
 169:   
 170:      return res;
 171:  }
 172:   
 173:  /*
 174:  combine the second to the first
 175:  */
 176:  void duplicate_and_combine(polynode p1,const polynode p2)
 177:  {
 178:      polynode c1=p1;
 179:      polynode c2=p2->next;
 180:      while(c1->next!=NULL)
 181:      {
 182:          c1=c1->next;
 183:      }
 184:   
 185:      while(c2!=NULL)
 186:      {
 187:          c1->next=create_newpoly();
 188:          c1->next->coefficient=c2->coefficient;
 189:          c1->next->exponent=c2->exponent;
 190:          c2=c2->next;
 191:          c1=c1->next;
 192:      }
 193:  }
 194:   
 195:  int main()
 196:  {
 197:      polynode p1=create_newpoly();
 198:      p1->next=create_newpoly();
 199:      p1->next->next=create_newpoly();
 200:      p1->next->coefficient=5;
 201:      p1->next->exponent=5;
 202:      p1->next->next->coefficient=4;
 203:      p1->next->next->exponent=4;
 204:      polynode p2=create_newpoly();
 205:      p2->next=create_newpoly();
 206:      p2->next->next=create_newpoly();
 207:      p2->next->coefficient=4;
 208:      p2->next->exponent=4;
 209:      p2->next->next->coefficient=3;
 210:      p2->next->next->exponent=3;
 211:      print_poly(p1);
 212:      print_poly(p2);
 213:   
 214:      polynode sum=add_polynomial1(p1,p2);
 215:      print_poly(sum);
 216:      sum=add_polynomial1(sum,p2);
 217:      print_poly(sum);
 218:      print_poly(p1);
 219:      print_poly(p2);
 220:   
 221:      sum=add_polynomial2(p1,p2);
 222:      print_poly(sum);
 223:      print_poly(p1);
 224:      print_poly(p2);
 225:   
 226:      polynode res=multiply1(p1,p2);
 227:      print_poly(res);
 228:      print_poly(p1);
 229:      print_poly(p2);
 230:   
 231:      polynode res2=multiply2(p1,p2);
 232:      print_poly(res2);
 233:      print_poly(p1);
 234:      print_poly(p2);
 235:      printf("Hello world!\n");
 236:      return 0;
 237:  }

在第80行需要handle系数之和为0的情况, 修改add_polynomial2函数fix此问题:

   1:  polynode add_polynomial2(const polynode p1, polynode p2)
   2:  {
   3:      polynode sum=create_newpoly();
   4:      polynode c1=p1->next;
   5:      polynode c2=p2->next;
   6:      polynode c3=sum;
   7:   
   8:      while(c1!=NULL && c2!=NULL)
   9:      {
  10:          if(c1->coefficient+c2->coefficient==0)
  11:          {
  12:              continue;
  13:          }
  14:          else
  15:          {
  16:              c3->next=create_newpoly();
  17:          }
  18:   
  19:   
  20:          if(c1->exponent>c2->exponent)
  21:          {
  22:              c3->next->exponent=c1->exponent;
  23:              c3->next->coefficient=c1->coefficient;
  24:              c1=c1->next;
  25:          }
  26:          else if(c1->exponent==c2->exponent)
  27:          {
  28:              c3->next->exponent=c1->exponent;
  29:              c3->next->coefficient=c1->coefficient+c2->coefficient;
  30:              c1=c1->next;
  31:              c2=c2->next;
  32:   
  33:          }
  34:          else
  35:          {
  36:              c3->next->exponent=c2->exponent;
  37:              c3->next->coefficient=c2->coefficient;
  38:              c2=c2->next;
  39:          }
  40:          c3=c3->next;
  41:      }
  42:   
  43:      polynode c4=NULL;
  44:      if(c1!=NULL)
  45:      {
  46:          c4=c1;
  47:      }
  48:      else if(c2!=NULL)
  49:      {
  50:          c4=c2;
  51:      }
  52:   
  53:      while(c4!=NULL)
  54:      {
  55:          c3->next=create_newpoly();
  56:          c3->next->exponent=c4->exponent;
  57:          c3->next->coefficient=c4->coefficient;
  58:          c4=c4->next;
  59:          c3=c3->next;
  60:      }
  61:   
  62:      return sum;
  63:  }
原文地址:https://www.cnblogs.com/dancewithautomation/p/2559446.html