算法名称:一元多项式算法

算法介绍:

加法运算:将具有与相同幂项的系数相加即可得到合并后的多项式。若某个幂项只存在于一个多项式中,则直接合并到结果中

举例

java 一元一次多项式拟合 一元多项式求和代码_java 一元一次多项式拟合

利用代码实现

java 一元一次多项式拟合 一元多项式求和代码_链表_02

这里主要使用了链表,通过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. }