Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. #include "queue.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. QUEUE queue_new() {
  6. // Devuelve una cola con los campos inicializados.
  7. QUEUE my_queue;
  8.  
  9. my_queue.head = NULL;
  10. my_queue.tail = NULL;
  11. my_queue.size = 0;
  12. return my_queue;
  13. }
  14.  
  15. void queue_init(QUEUE *my_queue) {
  16. my_queue->head = NULL;
  17. my_queue->tail = NULL;
  18. my_queue->size = 0;
  19. }
  20.  
  21. int queue_size(QUEUE my_queue) {
  22. // Devuelve el numero de elementos de la cola.
  23. return my_queue.size;
  24. }
  25.  
  26. bool queue_empty(QUEUE my_queue) {
  27. // Devuelve TRUE si la cola esta vacia.
  28. return (my_queue.size == 0);
  29. }
  30.  
  31. void queue_enqueue(QUEUE *my_queue, DATATYPE data) {
  32. // Inserta un nuevo elemento en la cola por el final.
  33. // La cola se pasa por referencia para poder modificar sus campos.
  34. QUEUE_NODE *ptr_queue_node;
  35.  
  36. // reservamos memoria para el nuevo nodo
  37. ptr_queue_node = malloc(sizeof(QUEUE_NODE));
  38. // asignamos el valor
  39. ptr_queue_node->data = data;
  40. ptr_queue_node->ptr_next = NULL;
  41. // si la cola es vacia, los punteros de inicio y fin apuntan al mismo nodo
  42. if(queue_empty(*my_queue)) {
  43. my_queue->head = ptr_queue_node;
  44. my_queue->tail = ptr_queue_node;
  45. } else {
  46. // insertar al final de la cola
  47. my_queue->tail->ptr_next = ptr_queue_node;
  48. // cambiamos la direccion de 'tail', que ahora es 'ptr_queue_node'
  49. my_queue->tail = ptr_queue_node;
  50. }
  51. // incrementamos 'size'
  52. (my_queue->size)++;
  53. }
  54.  
  55. DATATYPE queue_dequeue(QUEUE *my_queue) {
  56. // Borra el primer elemento de la cola.
  57. // La cola se pasa por referencia para poder modificar sus campos.
  58. QUEUE_NODE *ptr_del_node;
  59. DATATYPE retval;
  60.  
  61. // si la cola es vacia no hacemos nada
  62. if(queue_empty(*my_queue)) {
  63. return DATATYPE_ERR;
  64. }
  65. // asignamos el valor de retorno
  66. retval = my_queue->head->data;
  67. // si solo tenemos un elemento, lo borramos directamente
  68. if(queue_size(*my_queue) == 1) {
  69. free(my_queue->head);
  70. queue_init(my_queue);
  71. } else {
  72. // asignamos el nodo que queremos borrar
  73. ptr_del_node = my_queue->head;
  74. // avanzamos el nodo de la cola
  75. my_queue->head = my_queue->head->ptr_next;
  76. // borramos el nodo
  77. free(ptr_del_node);
  78. // decrementamos 'size'
  79. (my_queue->size)--;
  80. }
  81. return retval;
  82. }
  83.  
  84. void queue_clear(QUEUE *my_queue) {
  85. // Borra por completo una cola.
  86. QUEUE_NODE *ptr_aux_node, *ptr_del_node;
  87.  
  88. ptr_aux_node = my_queue->head;
  89. while(ptr_aux_node != NULL) {
  90. // asignamos el nodo que queremos borrar
  91. ptr_del_node = ptr_aux_node;
  92. // avanzamos el puntero
  93. ptr_aux_node = ptr_aux_node->ptr_next;
  94. // borramos el nodo
  95. free(ptr_del_node);
  96. }
  97. // inicializamos los campos de la estructura
  98. queue_init(my_queue);
  99. }
  100.  
  101. void queue_printf(QUEUE my_queue) {
  102. // Recorremos la cola con un puntero auxiliar;
  103. QUEUE_NODE *ptr_aux_node;
  104.  
  105. // mostrar el numero de elementos
  106. printf("Size: %d \n", queue_size(my_queue));
  107. // recorremos la cola hasta que no sea NULL
  108. ptr_aux_node = my_queue.head;
  109. while(ptr_aux_node != NULL) {
  110. // pintar el elemento por pantalla
  111. printf(" "DATATYPE_PRINTF" <- ",ptr_aux_node->data);
  112. // avanzar el puntero
  113. ptr_aux_node = ptr_aux_node->ptr_next;
  114. }
  115. printf("NULL \n\n");
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement