zoukankan      html  css  js  c++  java
  • 数据结构和算法-一元多项式运算算法(加法)

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

    算法介绍:

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

    举例

    利用代码实现

    这里主要使用了链表,通过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("内存分配失败 ");
    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("内存分配失败: ");
    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(" 前项=指数值不能小于前一项指数值%d! 重新输入 ",(*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(" 计算后的多项式共有%d项 ",p->expn);
    63. p1=p->next;
    64. i=1;
    65. while(p1)
    66. {
    67. printf("第%d项,系数:%g,指数:%d ",i++,p1->coef,p1->expn);
    68. p1=p1->next;
    69. }
    70. printf(" ");
    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("输入第一个多项式数据: ");
    142. PolynInput(&pa); //调用函数输入一个多项式
    143. printf(" 输入第二个多项式数据: ");
    144. PolynInput(&pb); //调用函数,输入另一个多项式
    145. PolynAdd(pa,pb); //调用多项式相加函数
    146. printf(" 两个多项式之和为:");
    147. PolynPrint(pa); //输出运算得到的多项式
    148. getch();
    149. return 0;
    150. }

    附件列表

    • 相关阅读:
      网络文件传输方式
      ETL利器Kettle
      oracle 字符处理
      ORACLE临时表空间
      Count(*)或者Count(1)或者Count([列]) 区别
      Oracle trunc()函数的用法
      DATE 日期格式
      oracle 异常
      物化视图
      域名和端口
    • 原文地址:https://www.cnblogs.com/aqyl/p/6863514.html
    Copyright © 2011-2022 走看看