Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5.  
  6. struct node {
  7. int coeficiente;
  8. char letra;
  9. int expoente;
  10. struct node *next;
  11. struct node *previous;
  12.  
  13. };
  14.  
  15. struct node *head = NULL;
  16. struct node *current = NULL;
  17. struct node *prev = NULL;
  18.  
  19. char d;
  20. //display the list
  21. void print_list(){
  22. struct node *current = head;
  23. //struct node *current = (struct node*) malloc(sizeof(struct node));
  24.  
  25. while(current != NULL){
  26. if (current->coeficiente==1 && current->expoente==1 )
  27. printf("%c\n",current->letra);
  28. else if(current->coeficiente==1 && current->expoente==1)
  29. printf("(%c)\n",current->letra);
  30. else if(current->expoente==1)
  31. printf("(%d%c)\n",current->coeficiente,current->letra);
  32. else if(current->coeficiente==1)
  33. printf("(%c^%d)\n",current->letra,current->expoente);
  34. else
  35. printf("(%d%c^%d)\n",current->coeficiente ,current->letra,current->expoente);
  36. current = current -> next;
  37. }
  38. }
  39. //insert link at the first location
  40.  
  41. void insertFirst(int coeficiente,char letra, int expoente) {
  42. //create a link
  43. struct node *link = (struct node*) malloc(sizeof(struct node));
  44.  
  45. link->coeficiente = coeficiente;
  46. link->letra = letra;
  47. link->expoente = expoente;
  48.  
  49.  
  50. //point it to old first node
  51. link->next = head;
  52.  
  53. //point first to new first node
  54. head = link;
  55. }
  56.  
  57.  
  58.  
  59. /*
  60. //delete first item
  61. struct node* deleteFirst() {
  62.  
  63. //save reference to first link
  64. struct node *tempLink = head;
  65.  
  66. //mark next to first link as first
  67. head = head->next;
  68.  
  69. //return the deleted link
  70. return tempLink;
  71. }
  72.  
  73. //is list empty
  74. bool isEmpty() {
  75. return head == NULL;
  76. }
  77. */
  78. int length() {
  79. int length = 0;
  80. struct node *current;
  81.  
  82. for(current = head; current != NULL; current = current->next) {
  83. length++;
  84. }
  85.  
  86. return length;
  87. }
  88.  
  89.  
  90. void sort() {
  91.  
  92. int i, j, k, tempcoeficiente, tempexpoente;
  93. char tempchar;
  94. struct node *current;
  95. struct node *next;
  96. int size = length();
  97. k = size ;
  98.  
  99. for ( i = 0 ; i < size - 1 ; i++, k-- ) {
  100. current = head;
  101. next = head->next;
  102.  
  103. for ( j = 1 ; j < k ; j++ ) {
  104.  
  105. if ( current->expoente < next->expoente) {
  106. tempexpoente = current->expoente;
  107. current->expoente = next->expoente;
  108. next->expoente = tempexpoente;
  109.  
  110. tempcoeficiente = current->coeficiente;
  111. current->coeficiente = next->coeficiente;
  112. next->coeficiente = tempcoeficiente;
  113.  
  114.  
  115. tempchar = current->letra;
  116. current->letra = next->letra;
  117. next->letra = tempchar;
  118. }
  119.  
  120. current = current->next;
  121. next = next->next;
  122. }
  123. }
  124. }
  125.  
  126. void reverse(struct node** head_ref) {
  127. struct node* prev = NULL;
  128. struct node* current = *head_ref;
  129. struct node* next;
  130.  
  131. while (current != NULL) {
  132. next = current->next;
  133. current->next = prev;
  134. prev = current;
  135. current = next;
  136. }
  137.  
  138. *head_ref = prev;
  139. }
  140. void normalize(){
  141. struct node *current = head;
  142. int factor_n=current->expoente;
  143. while(current != NULL){
  144. if(current->coeficiente%factor_n ==0){
  145. current->coeficiente=current->coeficiente/factor_n;
  146. if(current->coeficiente==1)
  147. printf("%c^%d ",current->letra,current->expoente);
  148. else
  149. printf("%d%c^%d ",current->coeficiente,current->letra,current->expoente);
  150.  
  151. }
  152. else
  153. printf("(%d/%d)%c^%d ",current->coeficiente,factor_n,current->letra,current->expoente);
  154.  
  155. current = current -> next;
  156. }
  157. }
  158.  
  159. //delete a link with given key
  160. struct node* delete(char letra, int coeficiente) {
  161.  
  162. //start from the first link
  163. struct node* current = head;
  164. struct node* previous = NULL;
  165.  
  166. //if list is empty
  167. if(head == NULL) {
  168. return NULL;
  169. }
  170.  
  171. //navigate through list
  172. while(current->letra != letra && current->coeficiente !=coeficiente) {
  173.  
  174. //if it is last node
  175. if(current->next == NULL) {
  176. return NULL;
  177. } else {
  178. //store reference to current link
  179. previous = current;
  180. //move to next link
  181. current = current->next;
  182. }
  183. }
  184.  
  185. //found a match, update the link
  186. if(current == head) {
  187. //change first to point to next link
  188. head = head->next;
  189. } else {
  190. //bypass the current link
  191. previous->next = current->next;
  192. }
  193.  
  194. return current;
  195. // }
  196. //find a link with given key
  197. }
  198. void soma(){
  199. struct node *current =head;
  200.  
  201.  
  202. while(current->next != NULL ){
  203. printf("ze\n");
  204.  
  205. if(current->letra == current->next->letra && current->expoente == current->next->expoente){
  206. current->coeficiente = current->coeficiente + current->next->coeficiente;
  207. current->letra = current->next->letra;
  208. printf("oi");
  209. current->expoente = current->next->expoente;
  210. if(current->next!=NULL)
  211. current->next = current->next->next;
  212. //insertFirst(pointer_node->coeficiente,pointer_node->letra,pointer_node->expoente);
  213.  
  214. //printf("\n\n%d %c %d\n",pointer_node->coeficiente,pointer_node->letra,pointer_node->expoente );
  215.  
  216. }
  217. else{
  218. current = current ->next;
  219. }
  220.  
  221. }
  222. //printf("%c letra %d expoente atual\n", current->letra,current->expoente);
  223. //struct node *pointer_node =(struct node*) malloc(sizeof(struct node));
  224.  
  225. //printf("%c letra %d expoente proximo\n", current->next->letra,current->next->expoente);
  226. //delete(current->letra,current->coeficiente);
  227.  
  228. //printf("%p\n",pointer_node);
  229. }
  230.  
  231. int main() {
  232. struct node *current =(struct node*) malloc(sizeof(struct node));
  233.  
  234. int n,i=0,a,c;
  235. char b;
  236. scanf("%d",&n);
  237. //print list
  238. while(i<n){
  239. scanf("%d %c %d",&a ,&b, &c);
  240. insertFirst(a,b,c);
  241. reverse(&head);
  242. i++;
  243. }
  244. sort();
  245. //normalize();
  246. print_list();
  247. printf("\n");
  248. soma();
  249. print_list();
  250.  
  251. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement