算法名称:一元多项式算法
算法介绍:
加法运算:将具有与相同幂项的系数相加即可得到合并后的多项式。若某个幂项只存在于一个多项式中,则直接合并到结果中
举例
利用代码实现
这里主要使用了链表,通过3个函数来进行操作。分别是Inpu函数,Add运算函数,打印函数。
代码:
1. /*采用链表的方式*/
2. #include<stdio.h>
3. #include<stdlib.h>
4. #include<limits.h>
5. typedef struct polyn //定义多项式的结构
6. {
7.
8. float coef; //系数项
9. int expn; //指数
10. struct polyn *next; //指向下一项
11. }POLYN,*pPOLYN;
12. void PolynInput(pPOLYN *p) //输入一元多项式
13. {
14. int i,min=INT_MIN; //INT_MIN是int型的最小数
15. pPOLYN p1,p2; //分别表示2个多项式的指针
16. if(!(*p=(POLYN *)malloc(sizeof(POLYN)))) //为头结点分配内存
17. {
18.
19. printf("内存分配失败 \n");
20. exit(0);
21. }
22. (*p)->coef=0; //设置头结点的系数为0
23. printf("输入该多项式的项数:");
24. scanf("%d",&((*p)->expn));
25. (*p)->next=NULL;
26. for(i=0;i<(*p)->expn;i++) //输入多项式各项
27. {
28. if(!(p1=(pPOLYN)malloc(sizeof(POLYN)))) //分配一个多项式的内存
29. {
30. printf("内存分配失败: \n");
31. exit(0);
32. }
33. printf("第%d项系数:",i+1);
34. scanf("%f",&(p1->coef));
35. do{
36. printf("第%d项指数:",i+1);
37. scanf("%d",&(p1->expn));
38. if(p1->expn<min)
39. printf("\n前项=指数值不能小于前一项指数值%d!\n重新输入\n",(*p)->next->expn);
40. }while(p1->expn<min);
41. min=p1->expn;
42. p1->next=(*p)->next;
43. (*p)->next=p1;
44. }
45. p1=(*p)->next; //合并多项式中指数值相同的项
46. while(p1)
47. {
48. p2=p1->next; //取下一节点
49. while(p2 && p2->expn==p1->expn) //若节点有效,节点与q节点的指数相同
50. {
51. p1->coef+=p2->coef; //累加系数
52. p1->next=p2->next; //删除r指向的节点
53. free(p2);
54. p2=p1->next;
55. (*p)->expn--;
56. }
57. p1=p1->next;
58. }
59. }
60. void PolynPrint(pPOLYN p) //输出多项式
61. {
62. pPOLYN p1;
63. int i;
64. printf("\n\n计算后的多项式共有%d项 \n",p->expn);
65. p1=p->next;
66. i=1;
67. while(p1)
68. {
69. printf("第%d项,系数:%g,指数:%d\n",i++,p1->coef,p1->expn);
70. p1=p1->next;
71. }
72. printf("\n");
73. }
74. void PolynAdd(pPOLYN pa,pPOLYN pb) //多项式相加pa=pa+pb
75. {
76.
77. pPOLYN pa1,pb1,pc1,p;
78. pa1=pa->next; //指向被加链表的第一个有效项
79. pb1=pb->next; //指向加链表的第一个有效项
80. pc1=pa; //指向被加链表
81. pc1->next=NULL;
82. pa->expn=0; //清空多项式项目数据
83. while(pa1 && pb1) //两个多项式都未结束
84. {
85.
86. if(pa1->expn > pb1->expn) //如果pa1指数大于pb1
87. {
88. pc1->next=pa1; //将pa1指数加入结果链表中
89. pc1=pa1;
90. pa1=pa1->next; //处理pa1中的下一项
91. pc1->next=NULL;
92.
93. }else if(pa1->expn < pb1->expn) //pa1的指数小于pb1的指数
94. {
95. pc1->next=pb1; //将pb1指数加入结果链表中
96. pc1=pb1;
97. pb1=pb1->next; //处理pb1的下一项
98. pc1->next=NULL;
99. }else { //pa1指数等于pb1指数,进行系统相加
100. pa1->coef+=pb1->coef; //累加素数
101. if(pa1->coef!=0) //若系数不为0
102. {
103. pc1->next=pa1; //将相加结果添加到结果链表中
104. pc1=pa1;
105. pa1=pa1->next; //处理pa1的下一项
106. pc1->next=NULL;
107. p=pb1;
108. pb1=pb1->next; //处理pb1的下一项
109. free(p);
110. }
111. else{ //系数为0,则不记录该项
112. p=pa1; //用p指向pa1中的该项
113. pa1=pa1->next; //链表中删除该项
114. free(p); //释放该项所占用内存
115. p=pb1; //用临时指针指向pb1中的该项
116. pb1=pa1->next; //链表中删除该项
117. free(p); //释放该项所占用内存
118. pa->expn--; //后面要进行累加操作,此处先减
119. }
120. }
121. pa-pa->expn++; //累加一个结果项
122. }
123. if(pa1) //若pa1中还有项
124. {
125. pc1->next=pa1; //将pa1中的项添加到结果链表中
126. while(pa1)
127. {
128.
129. pa->expn++;
130. pa1=pa1->next;
131. }
132. }
133. if(pb1) //若pb1中还有项
134. {
135.
136. pc1->next=pb1; //将pb1中的项添加到结果链表中
137. while(pb1)
138. {
139. pa->expn++;
140. pb1=pb1->next;
141. }
142. }
143. free(pb); //释放pb头链所占的内存空间
144. }
145. int main()
146. {
147. pPOLYN pa=NULL,pb=NULL; //指向多项式链表的指针
148. printf("输入第一个多项式数据:\n");
149. PolynInput(&pa); //调用函数输入一个多项式
150. printf("\n输入第二个多项式数据:\n");
151. PolynInput(&pb); //调用函数,输入另一个多项式
152. PolynAdd(pa,pb); //调用多项式相加函数
153. printf("\n两个多项式之和为:");
154. PolynPrint(pa); //输出运算得到的多项式
155. getch();
156. return 0;
157. }