1 /*
2 多项式ADT——单链表实现
3 */
4
5 /*接口头文件*/
6 #include <stdbool.h>
7 typedef int ElementType;
8
9 #ifndef _POLYNOMIAL_H
10 #define _POLYNOMIAL_H
11
12 struct Node;
13 typedef struct Node * PtrToNode;
14 typedef PtrToNode Polynomial;
15 typedef PtrToNode Position;
16
17 /*操作集*/
18 Polynomial MakeEmpty( Polynomial Poly );
19 bool IsEmpty( Polynomial Poly );
20 bool IsLast( Position P );
21 Position First( Polynomial Poly );
22 Position Header( Polynomial Poly );void DeleteList( Polynomial Poly );
23 void Insert( ElementType Coeff, ElementType Expon, Position P );
24 Position Advance( Position P );void PrintfList( Polynomial Poly );
25 void ListInsertSort( Polynomial Head );
26 Polynomial AddPolynomial( const Polynomial Poly1, const Polynomial Poly2, Polynomial PolySum );
27 Polynomial MulPolynomial( const Polynomial Poly1, const Polynomial Poly2, Polynomial PolyProd );
28
29 #endif
30
31 /*接口实现*/
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include "polynomial.h"
35
36 /*特定结构声明*/
37 struct Node
38 {
39 ElementType Coefficient;
40 ElementType Exponent;
41 Position Next;
42 };
43
44 /*合并同类项*/
45 Polynomial CombSimPolynomial( Polynomial Poly );
46
47 Polynomial MakeEmpty( Polynomial Poly )
48 {
49 if ( Poly != NULL )
50 DeleteList( Poly );
51
52 Poly = ( Polynomial )malloc( sizeof( struct Node ) );
53 if (Poly == NULL )
54 {
55 printf( "No Space,quit!\n" );
56 exit( 1 );
57 }
58 Poly->Next = NULL;
59
60 return Poly;
61 }
62
63 bool IsEmpty( Polynomial Poly )
64 {
65 return Poly->Next == NULL;
66 }
67
68 bool IsLast( Position P )
69 {
70 return P->Next == NULL;
71 }
72
73 Position First( Polynomial Poly )
74 {
75 return Poly->Next;
76 }
77
78 Position Header( Polynomial Poly )
79 {
80 return Poly;
81 }
82
83 void DeleteList( Polynomial Poly )
84 {
85 Position P;
86 Position Temp;
87
88 P = First( Poly );
89 while ( P != NULL )
90 {
91 Temp = Advance( P );
92 free( P );
93 P = Temp;
94 }
95 }
96
97 void Insert( ElementType Coeff, ElementType Expon, Position P )
98 {
99 Position Temp;
100
101 Temp = ( Polynomial )malloc( sizeof ( struct Node ) );
102 if ( Temp == NULL )
103 {
104 printf( "No Space,quit!\n" );
105 exit( 1 );
106 }
107 Temp->Coefficient = Coeff;
108 Temp->Exponent = Expon;
109 Temp->Next = P->Next;
110
111 P->Next = Temp;
112 }
113
114 Position Advance( Position P )
115 {
116 return P->Next;
117 }
118
119 void PrintfList( Polynomial Poly )
120 {
121 Position P;
122
123 if ( IsEmpty( Poly ) )
124 printf( "No Data\n" );
125 else
126 {
127 P = First( Poly );
128 while ( P != NULL )
129 {
130 /*当系数为0时,不输出*/
131 if ( P->Coefficient != 0)
132 {
133 /*指数为0时,只显示常数*/
134 if ( P->Exponent == 0 )
135 printf( "%d", P->Coefficient );
136 /*当位置P不是尾部且下个P不为负数,结果显示+号*/
137 else if ( P->Next != NULL && P->Next->Coefficient > 0 )
138 printf( "%d^%d+", P->Coefficient, P->Exponent );
139 /*当位置P是尾部或下个P为负数,结果不显示+号*/
140 else
141 printf( "%d^%d", P->Coefficient, P->Exponent );
142 }
143 P = Advance( P );
144 }
145 printf( "\n" );
146 }
147 }
148
149 /*
150 链表插入排序
151 策略:
152 将原链表Head拆分链表Head和链表Head1。其中链表Head只有一个元素。
153 不断从Head1中拿出一个元素插入Head中,直到Head1中没有元素为止。
154 */
155 void ListInsertSort( Polynomial Head )
156 {
157 Polynomial Head1;
158 Position P;
159 Position Q;
160 Position Temp;
161
162 /*空表或者只有一个元素则不排序*/
163 if ( Head->Next == NULL || Head->Next->Next == NULL )
164 return;
165 else
166 {
167 /*第一次拆分*/
168 Head1 = Head->Next->Next;
169 Head->Next->Next = NULL;
170
171 while ( Head1 != NULL )
172 {
173 /*降序排列*/
174 for ( P = First( Head ), Q = Header( Head ); P != NULL && Head1->Exponent < P->Exponent; Q = P, P = P->Next)
175 continue;
176
177 Temp = Head1; //待插入元素
178 Head1 = Head1->Next;
179 /*插入元素*/
180 Q->Next = Temp;
181 Temp->Next = P;
182 }
183
184 }
185 }
186
187 /*类似链表并集,核心是归并操作*/
188 Polynomial AddPolynomial( const Polynomial Poly1, const Polynomial Poly2, Polynomial PolySum )
189 {
190 Position P;
191 Position Ptr1;
192 Position Ptr2;
193
194 Ptr1 = First( Poly1 );
195 Ptr2 = First( Poly2 );
196 PolySum = MakeEmpty( NULL );
197 P = Header( PolySum );
198 while ( Ptr1 != NULL && Ptr2 != NULL )
199 {
200 if ( Ptr1->Exponent < Ptr2->Exponent )
201 {
202 Insert( Ptr2->Coefficient, Ptr2->Exponent, P );
203 Ptr2 = Advance( Ptr2 );
204 }
205 else if ( Ptr1->Exponent > Ptr2->Exponent )
206 {
207 Insert( Ptr1->Coefficient, Ptr1->Exponent, P );
208 Ptr1 = Advance( Ptr1 );
209 }
210 else
211 {
212 Insert( Ptr1->Coefficient + Ptr2->Coefficient, Ptr1->Exponent, P );
213 Ptr1 = Advance( Ptr1 );
214 Ptr2 = Advance( Ptr2 );
215 }
216 P = Advance( P );
217 }
218
219 while ( Ptr1 != NULL )
220 {
221 Insert( Ptr1->Coefficient, Ptr1->Exponent, P );
222 P = Advance( P );
223 Ptr1 = Advance( Ptr1 );
224 }
225
226 while ( Ptr2 != NULL )
227 {
228 Insert( Ptr2->Coefficient, Ptr2->Exponent, P );
229 P = Advance( P );
230 Ptr2 = Advance( Ptr2 );
231 }
232
233 return PolySum;
234 }
235
236 Polynomial MulPolynomial( const Polynomial Poly1, const Polynomial Poly2, Polynomial PolyProd )
237 {
238 Position P;
239 Position Ptr1;
240 Position Ptr2;
241
242 PolyProd = MakeEmpty( NULL );
243 P = Header( PolyProd );
244 Ptr1 = First( Poly1 );
245 Ptr2 = First( Poly2 );
246
247 while ( Ptr1 != NULL )
248 {
249 while ( Ptr2 != NULL )
250 {
251 Insert( ( Ptr1->Coefficient ) * ( Ptr2->Coefficient ), Ptr1->Exponent + Ptr2->Exponent, P );
252 P = Advance( P );
253 Ptr2 = Advance( Ptr2 );
254 }
255 Ptr1 = Advance( Ptr1 );
256 Ptr2 = First( Poly2 );
257 }
258 /*结果排序*/
259 ListInsertSort( PolyProd );
260 /*合并同类项*/
261 PolyProd = CombSimPolynomial( PolyProd );
262
263 return PolyProd;
264 }
265
266 Polynomial CombSimPolynomial( Polynomial Poly )
267 {
268 Polynomial Result;
269 Position P;
270 Position Q;
271
272
273 if ( Poly == NULL || Poly->Next->Next == NULL )
274 return Poly;
275 else
276 {
277 P = Poly->Next;
278 Q = P->Next;
279 while ( Q != NULL )
280 {
281 if ( P->Exponent == Q->Exponent )
282 {
283 P->Coefficient += Q->Coefficient;
284 P->Next = Q->Next;
285 Q = Q->Next;
286 }
287 else
288 {
289 P = P->Next;
290 Q = Q->Next;
291 }
292 }
293 return Poly;
294 }
295 }