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