数据结构和算法-一元多项式运算算法(加法)

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

算法介绍:

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

举例

利用代码实现

这里主要使用了链表,通过3个函数来进行操作。分别是Inpu函数,Add运算函数,打印函数。

代码:

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

附件列表

     

    posted @ 2017-05-16 20:28  sky七月凉  阅读(2560)  评论(0编辑  收藏  举报