Advertisement
Guest User

Untitled

a guest
Jul 15th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <limits.h>
  6.  
  7. typedef struct _deque deque_t;
  8. typedef struct _node   node_t;
  9.  
  10. //Guarda um ponteiro pro node anterior, para o proximo node e o valor guardado
  11. struct _node {
  12.     node_t *prev;
  13.     node_t *next;
  14.     int    value;
  15. };
  16.  
  17. //Guarda um ponteiro para o primeiro node, um ponteiro para o ultimo node, e o tamanho do deque
  18. struct _deque {
  19.     node_t *front;
  20.     node_t  *rear;
  21.     int      size;
  22. };
  23.  
  24. //Cria um node que guarda os valores que são enfileirados no deque
  25. node_t*  node_new     (int value);
  26.  
  27. //Cria um deque dinamicamente e retorna seu endereço de memoria
  28. deque_t* construct    ();
  29. //Libera a memória do conteúdo e do próprio deque
  30. void     destruct     (deque_t *deque);
  31.  
  32. //Retorna o tamanho do deque
  33. int      size         (deque_t *deque);
  34. //Retorna verdadeiro se o deque esta vazio, caso contrário, retorna falso
  35. bool     empty        (deque_t *deque);
  36.  
  37. //Retorna o valor da frente da lista, retorna int_min quando a lista estiver vazia
  38. int      front        (deque_t *deque);
  39. //Retorna o valor do fim da lista, retorna int_min quando a lista estiver vazia
  40. int      rear         (deque_t *deque);
  41.  
  42. //Cria um nó que guarda um valor e o adiciona ao fim do deque
  43. void     enqueue_rear (deque_t *deque, int value);
  44. //Cria um nó que guarda um valor e o adiciona ao inicio do deque
  45. void     enqueue_front(deque_t *deque, int value);
  46. //Retira o valor do final caso não esteja vazia
  47. void     dequeue_rear (deque_t *deque);
  48. //Retira o valor da frente caso não esteja vazia
  49. void     dequeue_front(deque_t *deque);
  50. //Limpa o conteudo do deque(deixa ele vazio)
  51. void     erase        (deque_t *deque);
  52.  
  53. //Imprime o deque em uma unica linha, com os elementos separados por um espaço,
  54. //terminando com um \n, lembrando de respeitar os conceitos de fila.
  55. void     print        (deque_t *deque);
  56.  
  57. int main() {
  58.     int i, num;
  59.     scanf("%d", &num);
  60.  
  61.     deque_t* deque = construct();
  62.  
  63.     int vector[num];
  64.     for(i = 0; i < num; ++i)
  65.         scanf("%d", &vector[i]);
  66.  
  67.     for(i = 0; i < num; ++i)
  68.         enqueue_rear(deque, vector[i]);
  69.  
  70.     printf("%d\n", front(deque));
  71.     printf("%d\n", rear (deque));
  72.  
  73.     if(!empty(deque))
  74.         printf("The size of the deque %d\n", size(deque));
  75.     else
  76.         printf("The deque is empty\n");
  77.    
  78.     scanf("%d", &num);
  79.     for(i = 0; i < num; ++i)
  80.     enqueue_front(deque, i);
  81.     print(deque);
  82.     dequeue_front(deque);
  83.     print(deque);
  84.     dequeue_rear (deque);
  85.     print(deque);
  86.    
  87.     erase(deque);
  88.     for(i = 0; i < 3; ++i)
  89.         enqueue_rear(deque, i);
  90.        
  91.     print(deque);
  92.     destruct(deque);
  93.        
  94.     return 0;
  95. }
  96.  
  97. node_t* node_new(int value)
  98. {
  99.     node_t* new_node=(node_t*) malloc(sizeof(node_t));
  100.     new_node->next=NULL;
  101.     new_node->prev=NULL;
  102.     new_node->value=value;
  103.     return new_node;
  104. }
  105.  
  106. deque_t* construct()
  107. {
  108.     deque_t* new_deque= (deque_t*) malloc(sizeof(deque_t));
  109.     new_deque->front=NULL;
  110.     new_deque->rear=NULL;
  111.     new_deque->size=0;
  112. }
  113.  
  114. void destruct(deque_t* deque)
  115. {
  116.     deque->rear = NULL;
  117.     while (deque->front != NULL)  
  118.     {
  119.         node_t* temp = deque->front;
  120.         deque->front = deque->front->next;
  121.         free(temp);
  122.     }
  123.     deque->size = 0;
  124. }
  125.  
  126. int size(deque_t *deque)
  127. {
  128.     return deque->size;
  129. }
  130.  
  131. bool empty (deque_t *deque)
  132. {
  133.     if(deque->size>0)
  134.     {
  135.         return false;
  136.     }
  137.     else
  138.     {
  139.         return true;
  140.     }
  141.    
  142. }
  143.  
  144. //Retorna o valor da frente da lista, retorna int_min quando a lista estiver vazia
  145. int front (deque_t *deque)
  146. {
  147.     if(empty(deque)) return INT_MIN;
  148.     return deque->front->value;
  149. }
  150. //Retorna o valor do fim da lista, retorna int_min quando a lista estiver vazia
  151. int rear (deque_t *deque)
  152. {
  153.     if(empty(deque)) return INT_MIN;
  154.     return deque->rear->value;
  155. }
  156.  
  157. //Cria um nó que guarda um valor e o adiciona ao fim do deque
  158. void enqueue_rear (deque_t *deque, int value)
  159. {
  160.     node_t *novono=node_new(value);
  161.     if(deque->rear==NULL)
  162.     {
  163.         deque->front=novono;
  164.         deque->rear=novono;
  165.     }
  166.     else
  167.     {
  168.         novono->prev =deque->rear;
  169.         deque->rear->next = novono;
  170.         deque->rear = novono;
  171.     }
  172.     deque->size++;
  173. }
  174.  
  175. //Cria um nó que guarda um valor e o adiciona ao inicio do deque
  176. void     enqueue_front(deque_t *deque, int value)
  177. {
  178.     node_t*novono=node_new(value);
  179.     if (deque->front == NULL)
  180.             deque->rear = deque->front = novono;
  181.         else
  182.         {
  183.             novono->next = deque->front;
  184.             deque->front->prev = novono;
  185.             deque->front = novono;
  186.         }
  187.  
  188.         deque->size++;
  189. }
  190. //Retira o valor do final caso não esteja vazia
  191. void     dequeue_rear (deque_t *deque)
  192. {
  193.     if (!empty(deque))
  194.     {
  195.         node_t* temp = deque->rear;
  196.         deque->rear = deque->rear->prev;
  197.         if (deque->rear == NULL)
  198.             deque->front = NULL;
  199.         else
  200.         {
  201.         deque->rear->next = NULL;
  202.         free(temp);
  203.         }
  204.         deque->size--;
  205.          
  206.     }
  207. }
  208. //Retira o valor da frente caso não esteja vazia
  209.  void     dequeue_front(deque_t *deque)
  210. {
  211.     if (!empty(deque))
  212.     {
  213.         node_t* temp = deque->front;
  214.         deque->front = deque->front->next;
  215.         if(deque->front == NULL)
  216.         {
  217.             deque->rear = NULL;
  218.         }
  219.         else
  220.         {
  221.         deque->front->prev = NULL;
  222.         free(temp);
  223.         }
  224.         deque->size--;
  225.          
  226.     }
  227. }
  228. void     erase        (deque_t *deque)
  229. {
  230.     deque->rear = NULL;
  231.     while (deque->front != NULL)  
  232.     {
  233.         node_t* temp = deque->front;
  234.         deque->front = deque->front->next;
  235.         free(temp);
  236.     }
  237.     deque->size = 0;
  238. }
  239. void print (deque_t *deque)
  240. {
  241.     node_t *aux = deque->front;
  242.         while (aux->next != NULL)
  243.         {
  244.             printf("%d ", aux->value);
  245.             aux = aux->next;
  246.         }
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement