Advertisement
vinocastro

ME3

Oct 26th, 2020 (edited)
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct polynode POLYNODE;
  5. typedef struct poly POLY;
  6. struct polynode
  7. {
  8. int x;
  9. int y;
  10. int z;
  11. float COEFF;
  12. POLYNODE* NEXT;
  13.  
  14. };
  15. struct poly
  16. {
  17. POLYNODE* l;
  18.  
  19. };
  20.  
  21. // 1 means node 1 is greater than node 2
  22. // 0 means node 1 is less than node 2
  23. // 2 means node 1 is equal to node 2 equal
  24.  
  25. int GREATER(POLYNODE* node1,POLYNODE* node2)
  26. {
  27. if(node1->x > node2->x)
  28. {
  29. return 1;
  30. }
  31. else if(node1->x == node2->x)
  32. {
  33. if(node1->y > node2->y)
  34. {
  35. return 1;
  36. }
  37. else if(node1->y == node2->y)
  38. {
  39. if(node1->z > node2->z)
  40. {
  41. return 1;
  42. }
  43. else if(node1->z == node2->z)
  44. {
  45. return 2;
  46. }
  47. else
  48. {
  49. return 0;
  50. }
  51.  
  52. }
  53. else
  54. {
  55. return 0;
  56. }
  57.  
  58. }
  59. else
  60. {
  61. return 0;
  62. }
  63.  
  64. }
  65.  
  66. void ZEROPOLY(POLY* P)
  67. {
  68. POLYNODE* tau;
  69. tau = malloc(sizeof(POLYNODE));
  70. P->l=tau;
  71. P->l->x = -1;
  72. P->l->y = -1;
  73. P->l->z = -1;
  74. P->l->COEFF = -999;
  75. P->l->NEXT = tau;
  76. }
  77.  
  78. void POLYREAD(POLY* P)
  79. {
  80. int n;
  81. scanf("%d",&n);
  82. POLYNODE* v;
  83. POLYNODE* alpha;
  84. POLYNODE* beta;
  85. v = malloc(sizeof(POLYNODE));
  86. int i = 0,ex,ey,ez;
  87. float coeff;
  88. ZEROPOLY(P);
  89. while(i < n)
  90. {
  91. v = malloc(sizeof(POLYNODE));
  92. scanf("%d %d %d %f",&ex,&ey,&ez,&coeff);
  93. v->x = ex;
  94. v->y = ey;
  95. v->z = ez;
  96. v->COEFF = coeff;
  97. beta = P->l;
  98. alpha = beta->NEXT;
  99. while(GREATER(alpha,v) == 1)
  100. {
  101. beta = alpha;
  102. alpha = alpha->NEXT;
  103. }
  104. beta->NEXT = v;
  105. v->NEXT = alpha;
  106. i++;
  107. }
  108. }
  109.  
  110. void POLYADD(POLY* P, POLY* Q)
  111. {
  112. POLYNODE* alpha;
  113. POLYNODE* beta;
  114. POLYNODE* sigma;
  115. POLYNODE* tau;
  116. alpha = P->l->NEXT;
  117. beta = Q->l->NEXT;
  118. sigma = Q->l;
  119. while(1)
  120. {
  121. if(GREATER(alpha,beta) == 0)
  122. {
  123. sigma = beta;
  124. beta = beta->NEXT;
  125. }
  126. else if (GREATER(alpha,beta) == 2)
  127. {
  128. if(alpha == P->l)
  129. {
  130. break;
  131. }
  132. beta->COEFF = beta->COEFF + alpha->COEFF;
  133. if(beta->COEFF == 0)
  134. {
  135. tau = beta;
  136. sigma->NEXT = beta->NEXT;
  137. beta = beta->NEXT;
  138. free(tau);
  139. }
  140. else
  141. {
  142. sigma = beta;
  143. beta = beta->NEXT;
  144. }
  145. alpha = alpha->NEXT;
  146. }
  147. else if (GREATER(alpha,beta) == 1)
  148. {
  149. tau = malloc(sizeof(POLYNODE));
  150. tau->COEFF = alpha->COEFF;
  151. tau->x = alpha->x;
  152. tau->y = alpha->y;
  153. tau->z = alpha->z;
  154. sigma->NEXT = tau;
  155. tau->NEXT = beta;
  156. sigma = tau;
  157. alpha = alpha->NEXT;
  158. }
  159.  
  160. }
  161. }
  162.  
  163. int main()
  164. {
  165. POLY P;
  166. POLY Q;
  167. POLYREAD(&P);
  168. POLYREAD(&Q);
  169. POLYADD(&P,&Q);
  170.  
  171. POLYNODE* curr;
  172. curr = Q.l->NEXT;
  173. while(curr != Q.l)
  174. {
  175. printf("%d %d %d %.3f\n",curr->x,curr->y,curr->z,curr->COEFF);
  176. curr = curr->NEXT;
  177. }
  178.  
  179. return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement