deque.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "deque.h"
  2. struct no {
  3. struct no *ant, *prox;
  4. int info;
  5. };
  6. struct deque {
  7. struct no *inicio, *final;
  8. int qtd;
  9. };
  10. Deque cria_deque()
  11. {
  12. Deque dq = (Deque) malloc(sizeof(struct deque));
  13. if(dq != NULL) {
  14. dq->final = NULL;
  15. dq->inicio = NULL;
  16. dq->qtd = 0;
  17. }
  18. return dq;
  19. }
  20. int deque_vazio(Deque dq)
  21. {
  22. if(dq == NULL || dq->inicio == NULL)
  23. return 1;
  24. return 0;
  25. }
  26. int insere_inicio(Deque dq, int elem)
  27. {
  28. if(dq == NULL)
  29. return 0;
  30. Elem no = (Elem) malloc(sizeof(struct no));
  31. if(no == NULL)
  32. return 0;
  33. no->info = elem;
  34. no->prox = dq->inicio;
  35. no->ant = NULL;
  36. /* Caso Deque vazio */
  37. if(dq->inicio == NULL)
  38. dq->final = no;
  39. else
  40. dq->inicio->ant = no;
  41. dq->inicio = no;
  42. dq->qtd++;
  43. return 1;
  44. }
  45. int insere_final(Deque d, int n)
  46. {
  47. if(d == NULL ) return 0;
  48. struct no *no = (struct no*)malloc(sizeof(struct no));
  49. if(no == NULL) return 0;
  50. no->info = n;
  51. no->prox = NULL;
  52. if(d->final == NULL){ //! deque vazio
  53. no->ant = NULL;
  54. d->inicio = no;
  55. }
  56. else{
  57. no->ant = d->final; //! no ant eh o novo final para que se insira o novo no final
  58. d->final->prox = no; //! o proximo no passa a ser o novo
  59. }
  60. d->final = no;
  61. d->qtd++;
  62. return 1;
  63. }
  64. int remove_inicio(Deque dq)
  65. {
  66. if(dq == NULL || deque_vazio(dq))
  67. return 0;
  68. Elem no = dq->inicio;
  69. dq->inicio = dq->inicio->prox;
  70. if(dq->inicio == NULL)
  71. dq->final = NULL;
  72. else
  73. dq->final->ant = NULL;
  74. free(no);
  75. dq->qtd--;
  76. return 1;
  77. }
  78. int remove_final(Deque d)
  79. {
  80. if(deque_vazio(d)==1) return 0;
  81. Elem no = d->final;
  82. if(no == d->inicio){ //! so tem um elemento
  83. d->inicio = NULL;
  84. d->final = NULL;
  85. }else{
  86. no->ant->prox = NULL;
  87. d->final = no->ant;
  88. }
  89. free(no);
  90. d->qtd--;
  91. return 1;
  92. }
  93. int imprime_deque(Deque dq)
  94. {
  95. Elem no = dq->inicio;
  96. printf("Deque:\n\t{ ");
  97. while(no != NULL) {
  98. printf("%d ", no->info);
  99. no = no->prox;
  100. }
  101. printf("}\n");
  102. return 1;
  103. }