Guest User

Untitled

a guest
Apr 22nd, 2018
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.06 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <cstdlib>
  5. int Total_of_element_in_list = 0; //<-- VARIABLE DE ARITMETICA MODULAR
  6. using namespace std;
  7.  
  8. //VARIABLE UNIVERSAL PARA ARITMETICA MODULAR
  9.  
  10.  
  11.  
  12. //DEFINE NODOS
  13.  
  14. struct node
  15. {
  16. int node_content;
  17. struct node *previous_position;
  18. struct node *next_position;
  19. };
  20.  
  21. struct node *head_list; //<-- NODO QUE APUNTA A LA CABEZA
  22.  
  23. //LISTA DE FUNCIONES
  24.  
  25. struct node *InsertInCircularlist(struct node *head_list, int element); // <-- FUNCION QUE LLENA LAS LISTAS CIRCULARES
  26.  
  27. struct node *PrintCircularList (struct node *head_list); //<-- FUNCION QUE IMPRIME LAS LISTAS CIRCULARES
  28.  
  29. struct node *LocateNode(int number_of_moves, struct node *head_list, int flag); //<-- FUNCION QUE ELIMINA UN NODO DE LAS LISTAS CIRCULARES
  30.  
  31. struct node *DeleteNodeInCircularlist (struct node *node_to_eliminate, struct node *head_list); //<-- FUNCION QUE ELIMINA UN NODO DE LAS LISTAS CIRCULARES
  32. //--------------------------------------------------------------------------------------------------------------------------//
  33.  
  34. //FUNCION PRINCIPAL
  35.  
  36. int main()
  37. {
  38. struct node *head_list; //<-- PUNTERO QUE APUNTARA A LA CABEZA DE LA LISTA
  39. int n; //<-- NUMERO DE PERSONAS EN EL CIRCULO
  40. int k; //<-- NUMERO DE MOVIMIENTOS INICIAL ANTES DE ELIMINAR
  41. int flag = 1; //<-- BANDERA QUE DECIDIRÁ SI ESTA CONTANDO EN SENTIDO HORARIO O ANTIHORARIO
  42.  
  43. while (scanf("%d %d", &n, &k) && n != 0 && k!= 0)
  44. {
  45. Total_of_element_in_list= n;
  46. head_list = NULL; //<-- EL NODO LISTA COMIENZA APUNTANDO A NULL (HACIA NADA)
  47.  
  48. for (int i=1; i<= n; i++)
  49. {
  50. head_list = InsertInCircularlist(head_list, i); //<-- LLENA AUTOMATICAMENTE EL NODO
  51. }
  52.  
  53. //PrintCircularList(head_list);
  54. //printf("LISTA IMPRESA EXITOSAMENTE \n\n"); <-- ESTA FUNCION PUEDE SER DESBLOQUEADA PARA VER LA LISTA EN CADA MOMENTO
  55.  
  56. while(n != 1)
  57. {
  58. head_list=LocateNode(k, head_list, flag); //<-- LOCALIZA EL NODO MOVIENDOSE DE MANERA HORARIA O ANTIHORARIA
  59. flag++;
  60. n--;
  61. }
  62.  
  63. flag = 1;
  64. printf("%d \n", head_list->node_content); //<-- RETORNA AL ESTUDIANTE GANADOR DE LA NOTA EN EL EXAMEN
  65.  
  66.  
  67. }
  68.  
  69. return 0;
  70. }
  71.  
  72. //--------------------------------------------------------------------------------------------------------------------------//
  73.  
  74. //INSERT IN CIRCULAR LIST
  75.  
  76. struct node *InsertInCircularlist (struct node *head_list, int element)
  77. {
  78. struct node *new_node; //<-- NODO CON EL QUE NOS MOVEREMOS EN LA LISTA
  79. new_node=(struct node *)malloc(sizeof(struct node)); //<-- DEFINIMOS UN ESPACIO EN LA MEMORIA PARA EL NODO
  80. new_node->node_content = element; //<-- LE ASIGNAMOS ELEMENT AL CONTENIDO DEL NODO
  81.  
  82. if (head_list == NULL)
  83. {
  84. new_node -> next_position = new_node; //<-- EL NEW_NODE SE ENLAZA ASI MISMO DE ADELANTE HACIA ATRAS
  85. new_node -> previous_position = new_node; //<-- EL NEW_NODE SE ENLAZA ASÍ MISMO DE ATRAS HACIA ADELANTE
  86. }
  87. else
  88. {
  89. new_node -> next_position = head_list -> next_position; //<-- EL NEW_NODE SE ENLAZA HACIA DONDE APUNTA HEAD_LIST
  90. new_node -> previous_position = head_list; //<-- EL NEW_NODE SE ENLAZA POR DETRÁS HACIA HEAD_LIST
  91. head_list -> next_position = new_node; //<-- EL HEAD_LIST SE ENLAZA HACIA EL NEW_NODE
  92. new_node -> next_position -> previous_position = new_node; //<--
  93. }
  94.  
  95. head_list = new_node; //<-- AHORA NEW_NODE ES LA CABEZA DE LA LISTA CIRUCLAR
  96.  
  97. return head_list; //<-- RETORNA LA CABEZA DE LA LISTA PARA USARLA EN OTRAS COSAS;
  98. }
  99.  
  100. //--------------------------------------------------------------------------------------------------------------------------//
  101.  
  102. //PRINT CIRCULAR LIST
  103.  
  104. struct node *PrintCircularList(struct node *head_list)
  105. {
  106.  
  107. struct node *new_node; //<-- NODO CON EL QUE NOS MOVEREMOS EN LA LISTA
  108. new_node=(struct node *)malloc(sizeof(struct node)); //<-- DEFINIMOS UN ESPACIO EN LA MEMORIA PARA EL NODO
  109. new_node= head_list;
  110.  
  111. if (head_list != NULL)
  112. {
  113. do
  114. {
  115. printf("%d ", new_node -> node_content); // <-- IMPRIME EL CONTENIDO DEL NODO QUE ESTAMOS MOVIENDO
  116. new_node = new_node -> next_position; // <-- MUEVE LA DIRECCIÓN DEL NODO HACIA EL SIGUIENTE DEL QUE ESTÁ APUNTANDO
  117. } while (new_node != head_list);
  118. }
  119. else
  120. printf("THE LIST IS EMPTY\n");
  121.  
  122. printf("\n"); // <-- DA UN SALTO DE LINEA PARA NO CONFUNDIR DATOS
  123.  
  124. return head_list;
  125. }
  126.  
  127. //--------------------------------------------------------------------------------------------------------------------------//
  128.  
  129. //LOCATE NODE
  130.  
  131. struct node *LocateNode (int number_of_moves, struct node *head_list, int flag)
  132. {
  133. int number_of_moves_copy; //<-- CREA UNA COPIA PARA SER EVALUADA POR ARITMETICA MODULAR
  134. number_of_moves_copy = number_of_moves % Total_of_element_in_list; //<-- EVALUA LA COPIA
  135.  
  136. if (number_of_moves_copy == 0)
  137. number_of_moves_copy = number_of_moves; //<-- DEVUELVE EL VALOR ORIGINAL SI ESTA HA PASADO EL FILTRO
  138.  
  139.  
  140. if (flag % 2 != 0) //<-- MOVIMIENTO EN SENTIDO DE LAS MANECILLAS DEL RELOJ
  141. {
  142. for (int i=1; i<number_of_moves_copy; i++)
  143. head_list = head_list -> next_position; //<-- ACCION DE MOVIMIENTO EN EL CIRCULO
  144.  
  145. head_list = DeleteNodeInCircularlist (head_list, head_list); //<-- ELIMINA EL "ESTUDIANTE SELECCIONADO"
  146. Total_of_element_in_list--;
  147. }
  148. else //<-- MOVIMIENTO EN CONTRA DE LAS MANECILLAS DEL RELOJ
  149. {
  150. for (int i=1; i<number_of_moves_copy; i++)
  151. head_list = head_list -> previous_position; //<-- ACCION DE MOVIMIMIENTO EN EL CIRCULO
  152.  
  153. head_list = DeleteNodeInCircularlist (head_list, head_list); //<-- ELIMINA EL "ESTUDIDANTE SELECCIONADO"
  154. Total_of_element_in_list--;
  155. head_list = head_list -> previous_position; //<-- POSICIONA EL NUEVO ESTUDIANTE PARA COMENZAR A CONTAR DE NUEVO
  156. }
  157. return head_list; //<-- RETORNA AL GANADOR
  158. }
  159.  
  160. //--------------------------------------------------------------------------------------------------------------------------//
  161.  
  162. //DELETE NODE IN CIRCULAR LIST
  163.  
  164. struct node *DeleteNodeInCircularlist (struct node *node_to_eliminate, struct node *head_list)
  165. {
  166. struct node *actual_node; // <-- NODO CON EL QUE NOS MOVEREMOS
  167. if (head_list == NULL)
  168. printf("THE LIST IS EMPTY\n");
  169. else
  170. {
  171.  
  172. if (head_list == head_list -> next_position) //<-- SI LA CABEZA SE APUNTA A SÍ MISMA
  173. {
  174. free(head_list); //<-- LIBERA EL NODO HEAD_LIST
  175. head_list = NULL; //<-- DEJA AL APUNTADOR APUNTANDO A LA NADA
  176. }
  177. else
  178. {
  179. actual_node = node_to_eliminate -> next_position; //<-- QUE EL ACTUAL_NODE SE MUEVA HACIA EL NODO DONDE APUNTA NODE_TO_ELIMINATE
  180. node_to_eliminate -> next_position = actual_node -> next_position; //<-- QUE EL NODE_TO_ELIMINATE APUNTE A DONDE APUNTA EL ACTUAL_NODE
  181. actual_node -> next_position -> previous_position = node_to_eliminate; //<-- QUE EL NODO AL QUE APUNTA ACTUAL_NODE APUNTE POR DETRAS HACIA EL ADENALTE DEL NODE_TO_ELIMINATE
  182. if (head_list == actual_node)
  183. {
  184. head_list = node_to_eliminate;
  185. }
  186. free (actual_node);
  187. }
  188. }
  189. return head_list;
  190. }
Add Comment
Please, Sign In to add comment