Advertisement
Guest User

Untitled

a guest
Jul 15th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.10 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.  
  98.  
  99.  
  100.  
  101.  
  102. node_t* node_new(int value)
  103. {
  104.     node_t* new_node=(node_t*) malloc(sizeof(node_t));
  105.     new_node->next=NULL;
  106.     new_node->prev=NULL;
  107.     new_node->value=value;
  108.     return new_node;
  109. }
  110.  
  111. deque_t* construct()
  112. {
  113.     deque_t* new_deque= (deque_t*) malloc(sizeof(deque_t));
  114.     new_deque->front=NULL;
  115.     new_deque->rear=NULL;
  116.     new_deque->size=0;
  117. }
  118.  
  119. void destruct(deque_t* deque)
  120. {
  121.     deque->rear = NULL;
  122.     while (deque->front != NULL)  
  123.     {
  124.         node_t* temp = deque->front;
  125.         deque->front = deque->front->next;
  126.         free(temp);
  127.     }
  128.     deque->size = 0;
  129. }
  130.  
  131. int size(deque_t *deque)
  132. {
  133.     return deque->size;
  134. }
  135.  
  136. bool empty (deque_t *deque)
  137. {
  138.     if(deque->size>0)
  139.     {
  140.         return 0;
  141.     }
  142.     else
  143.     {
  144.         return 1;
  145.     }
  146.    
  147. }
  148.  
  149. //Retorna o valor da frente da lista, retorna int_min quando a lista estiver vazia
  150. int front (deque_t *deque)
  151. {
  152.     if(empty(deque)) return INT_MIN;
  153.     return deque->front->value;
  154. }
  155. //Retorna o valor do fim da lista, retorna int_min quando a lista estiver vazia
  156. int rear (deque_t *deque)
  157. {
  158.     if(empty(deque)) return INT_MIN;
  159.     return deque->rear->value;
  160. }
  161.  
  162. //Cria um n? que guarda um valor e o adiciona ao fim do deque
  163. void enqueue_rear (deque_t *deque, int value)
  164. {
  165.     node_t *novono=node_new(value);
  166.     if(deque->rear==NULL)
  167.     {
  168.         deque->front=novono;
  169.         deque->rear=novono;
  170.     }
  171.     else
  172.     {
  173.         novono->prev =deque->rear;
  174.         deque->rear->next = novono;
  175.         deque->rear = novono;
  176.     }
  177.     deque->size++;
  178. }
  179.  
  180. //Cria um n? que guarda um valor e o adiciona ao inicio do deque
  181. void     enqueue_front(deque_t *deque, int value)
  182. {
  183.     node_t*novono=node_new(value);
  184.     if (deque->front == NULL)
  185.             deque->rear = deque->front = novono;
  186.         else
  187.         {
  188.             novono->next = deque->front;
  189.             deque->front->prev = novono;
  190.             deque->front = novono;
  191.         }
  192.  
  193.         deque->size++;
  194. }
  195. //Retira o valor do final caso n?o esteja vazia
  196. void     dequeue_rear (deque_t *deque)
  197. {
  198.     if (!empty(deque))
  199.     {
  200.         node_t* temp = deque->rear;
  201.         deque->rear = deque->rear->prev;
  202.         if (deque->rear == NULL)
  203.             deque->front = NULL;
  204.         else
  205.         {
  206.         deque->rear->next = NULL;
  207.         free(temp);
  208.         }
  209.         deque->size--;
  210.          
  211.     }
  212. }
  213. //Retira o valor da frente caso n?o esteja vazia
  214.  void     dequeue_front(deque_t *deque)
  215. {
  216.     if (!empty(deque))
  217.     {
  218.         node_t* temp = deque->front;
  219.         deque->front = deque->front->next;
  220.         if(deque->front == NULL)
  221.         {
  222.             deque->rear = NULL;
  223.         }
  224.         else
  225.         {
  226.         deque->front->prev = NULL;
  227.         free(temp);
  228.         }
  229.         deque->size--;
  230.          
  231.     }
  232. }
  233. void     erase        (deque_t *deque)
  234. {
  235.     deque->rear = NULL;
  236.     while (deque->front != NULL)  
  237.     {
  238.         node_t* temp = deque->front;
  239.         deque->front = deque->front->next;
  240.         free(temp);
  241.     }
  242.     deque->size = 0;
  243. }
  244. void print (deque_t *deque)
  245. {
  246.     node_t *aux = deque->front;
  247.         while (aux != NULL)
  248.         {
  249.             if(aux->next==NULL)
  250.             {
  251.                 printf("\n");
  252.             }
  253.             else
  254.             {
  255.                 printf("%d ", aux->value);
  256.                 aux = aux->next;
  257.             }
  258.            
  259.            
  260.         }
  261.        
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement