1. 程式人生 > >數據結構和算法-一元多項式運算算法(加法)

數據結構和算法-一元多項式運算算法(加法)

stdlib.h ted 技術分享 系統 名稱 scanf 設置 小數 表示

算法名稱:一元多項式算法

算法介紹:

加法運算:將具有與相同冪項的系數相加即可得到合並後的多項式。若某個冪項只存在於一個多項式中,則直接合並到結果中

舉例

技術分享

利用代碼實現

技術分享

這裏主要使用了鏈表,通過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. }

附件列表

    數據結構和算法-一元多項式運算算法(加法)