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: }

浙公网安备 33010602011771号