一元多项式Polynomial的C语言实现
1 /* 2 编译器:Dev-c++ 5.4.0 3 文件名:Polynomial.cpp 4 代码版本号:1.0 5 时间:2015年10月9日21:53:26 6 */ 7 8 /* 9 总结: 10 1.结构体指针指向的区域要手动分配内存 11 2.反复使用的代码封装成函数 12 */ 13 #include <stdio.h> 14 #include <stdlib.h> 15 16 #define ERROR 0 17 #define OK 1 18 #define TRUE 1 19 #define FALSE 0 20 #define OVERFLOW -2 21 22 typedef int Status; 23 typedef struct 24 { 25 float coef; 26 int expn; 27 }term, ElemType; 28 29 typedef struct LNode 30 { 31 ElemType *data; 32 struct LNode *next; 33 }LNode,*Link,*Position; 34 35 typedef struct _LinkList 36 { 37 Link head,tail; 38 int len; 39 }LinkList; 40 41 /*多项式的初始化,建立头结点*/ 42 Status initPolynomial(LinkList *l){ 43 Link p; 44 p=(Link)malloc(sizeof(LNode)); 45 if(!p) 46 exit(OVERFLOW); 47 48 p->next=NULL; 49 (*l).head=(*l).tail=p; 50 (*l).len=0; 51 printf("多项式初始化成功\n"); 52 return OK; 53 } 54 55 /*判断多项式是否为空表*/ 56 bool listEmpty(LinkList *l){ 57 return !l->len; 58 } 59 60 /*整数比较函数*/ 61 int comp(int a1,int a2) 62 { 63 if(a1>a2) 64 return 1; 65 else 66 if(a1==a2) 67 return 0; 68 else 69 return -1; 70 } 71 72 /*判断新节点的指数,定位节点在多项式中是否已经存在*/ 73 int locateLNode(LinkList *l,LNode *p){ 74 75 LNode *q=((*l).head)->next; 76 // if(q) printf("q->data->expn为%d,p->data->expn为%d",q->data->expn,p->data->expn); 77 while(q&&(q->data->expn!=p->data->expn)) 78 { 79 q=q->next; 80 81 } 82 // printf("地址%p\n",q); 83 if(!q) 84 return 0; 85 else 86 { 87 return 1; 88 }; 89 90 } 91 /*销毁多项式*/ 92 Status destroyPoly(LinkList *l){ 93 LNode *p; 94 LNode *q=l->head; 95 while(q) 96 { 97 p=q->next; 98 free(p); 99 q=q->next; 100 } 101 free(l->head); 102 103 104 return OK; 105 } 106 /*创建一个结点*/ 107 LNode *createLNode(){ 108 LNode *q=(LNode*)malloc(sizeof(LNode)); 109 q->data=(ElemType*)malloc(sizeof(ElemType)); 110 return q; 111 } 112 113 /*case 新节点的指数相等时只需系数相加*/ 114 Status lNodePlus(LinkList *l,LNode *p){ 115 116 LNode *q=((*l).head)->next; 117 while(q && q->data->expn!=p->data->expn) 118 { 119 q=q->next; 120 121 } 122 if(!q) 123 return OK; 124 else 125 { 126 127 q->data->coef+=p->data->coef; 128 return OK; 129 } 130 } 131 /*case 插入新节点*/ 132 Status insertLNode(LinkList *l,LNode *p){ 133 134 LNode *q=((*l).head)->next; 135 136 LNode *qian=(*l).head;//q的前一个节点 137 while(q&&q->data->expn < p->data->expn){ 138 139 qian=q; 140 q=q->next; 141 } 142 p->next=q; 143 qian->next=p; 144 l->len++; 145 return OK; 146 } 147 /*all 插入节点*/ 148 Status LNodePlus(LinkList *l,LNode *p){ 149 if(locateLNode(l,p)){ 150 lNodePlus(l,p);//指数相等时只需要系数相加 151 } 152 else{ 153 insertLNode(l,p); 154 } 155 return OK; 156 } 157 158 /*创建多项式m项的系数和指数*/ 159 Status createPolynomial(LinkList *l,int m){ 160 161 float coef; //系数coefficient 162 int expn;//指数exponent 163 for(int i=1;i<=m;i++){ 164 printf("\n请输入第%d个系数和指数",i); 165 LNode *p=createLNode(); 166 scanf("%f",&(p->data->coef)); 167 scanf("%d",&(p->data->expn)); 168 LNodePlus(l,p); 169 } 170 printf("多项式创建完毕\n"); 171 } 172 173 /*循环输出多项式的系数和指数*/ 174 Status polyTraverse(LinkList *l) 175 { 176 LNode *q=((*l).head)->next; 177 printf("\n该多项式有%d个项\n",l->len); 178 while(q) 179 { 180 printf("%fx^%d+",q->data->coef,q->data->expn); 181 q=q->next; 182 } 183 return OK; 184 } 185 186 187 /*多项式的加法*/ 188 LinkList addPoly(LinkList *l1,LinkList *l2){ 189 190 LNode *q1=((*l1).head)->next; 191 LNode *q2=((*l2).head)->next; 192 LinkList l; 193 initPolynomial(&l); 194 LNode* p=l.head;//p指向多项式最后一项 195 while(q1 && q2){ 196 197 switch(comp(q1->data->expn,q2->data->expn)) 198 { 199 case 1:{ 200 LNode *q=createLNode(); 201 202 q->data->coef=q2->data->coef; 203 q->data->expn=q2->data->expn; 204 205 q->next=NULL; 206 p->next=q; 207 p=p->next; 208 209 q2=q2->next; 210 l.len++; 211 break; 212 } 213 case 0:{ 214 LNode *q=createLNode(); 215 216 q->data->coef=q1->data->coef+q2->data->coef; 217 q->data->expn=q1->data->expn; 218 219 q->next=NULL; 220 p->next=q; 221 p=p->next; 222 223 q1=q1->next; 224 q2=q2->next; 225 l.len++; 226 break; 227 } 228 case -1:{ 229 LNode *q=createLNode(); 230 231 q->data->coef=q1->data->coef; 232 q->data->expn=q1->data->expn; 233 234 q->next=NULL; 235 p->next=q; 236 p=p->next; 237 238 q1=q1->next; 239 l.len++; 240 break; 241 } 242 } 243 } 244 245 while(q1){ 246 LNode *q=createLNode(); 247 q->data->coef=q1->data->coef; 248 q->data->expn=q1->data->expn; 249 q->next=NULL; 250 p->next=q; 251 p=p->next; 252 q1=q1->next; 253 l.len++; 254 } 255 256 while(q2){ 257 LNode *q=createLNode(); 258 q->data->coef=q2->data->coef; 259 q->data->expn=q2->data->expn; 260 q->next=NULL; 261 p->next=q; 262 p=p->next; 263 q2=q2->next; 264 l.len++; 265 } 266 267 268 return l; 269 } 270 271 /*多项式系数取反*/ 272 Status getOpposite(LinkList *l){ 273 LNode *q=l->head->next; 274 while(q) 275 { 276 q->data->coef=(-(q->data->coef)); 277 q=q->next; 278 } 279 return OK; 280 } 281 /*多项式的减法*/ 282 LinkList subtractPoly(LinkList *l1,LinkList *l2){ 283 getOpposite(l2); 284 LinkList l=addPoly(l1,l2); 285 getOpposite(l2); 286 return l; 287 } 288 289 /*多项式的乘法*/ 290 LinkList multiplyPoly(LinkList *l1,LinkList *l2){ 291 292 LinkList l; 293 initPolynomial(&l); 294 LNode *q1=l1->head->next; 295 LNode *q2=l2->head->next; 296 while(q1){ 297 q2=l2->head->next; 298 while(q2){ 299 LNode *q=createLNode(); 300 q->data->coef=q1->data->coef*q2->data->coef; 301 q->data->expn=q1->data->expn+q2->data->expn; 302 printf("q2->data->coef为%f\n",q2->data->coef); 303 LNodePlus(&l,q); 304 q2=q2->next; 305 } 306 q1=q1->next; 307 } 308 return l; 309 } 310 311 312 int main(){ 313 LinkList l1,l2; 314 315 /*int n; 316 LinkList l3; 317 initPolynomial(&l3); 318 printf("请输入多项式的term个数:\n"); 319 scanf("%d",&n); 320 createPolynomial(&l3,n); 321 polyTraverse(&l3); 322 destroyPoly(&l3); 323 printf("删除后遍历:\n"); 324 polyTraverse(&l3);*/ 325 326 int m; 327 initPolynomial(&l1); 328 initPolynomial(&l2); 329 printf("请输入多项式的term个数:\n"); 330 scanf("%d",&m); 331 createPolynomial(&l1,m); 332 createPolynomial(&l2,m); 333 polyTraverse(&l1); 334 polyTraverse(&l2); 335 LinkList L3=addPoly(&l1,&l2); 336 printf("多项式相加后\n"); 337 polyTraverse(&L3); 338 LinkList L4=subtractPoly(&l1,&l2); 339 printf("多项式相减后\n"); 340 polyTraverse(&L4); 341 LinkList L5=multiplyPoly(&l1,&l2); 342 printf("多项式相乘后\n"); 343 polyTraverse(&L5); 344 system("pause"); 345 return 0; 346 }