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! " ); 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! " ); 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 " ); 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( " " ); 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 }