一元多项式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 }

 

posted @ 2015-10-09 21:55  钢铁侠Mac  阅读(3129)  评论(0编辑  收藏  举报