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 }