fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // Estrutura do nó
  5. typedef struct No {
  6. int id;
  7. struct No* prox;
  8. } No;
  9.  
  10. // Estrutura da fila
  11. typedef struct {
  12. No* inicio;
  13. No* fim;
  14. } Fila;
  15.  
  16. // Inicializa fila
  17. void inicializarFila(Fila* f) {
  18. f->inicio = NULL;
  19. f->fim = NULL;
  20. }
  21.  
  22. // Verifica se fila está vazia
  23. int filaVazia(Fila* f) {
  24. return f->inicio == NULL;
  25. }
  26.  
  27. // Enfileira elemento no final
  28. void enfileirar(Fila* f, int id) {
  29. No* novo = (No*) malloc(sizeof(No));
  30. novo->id = id;
  31. novo->prox = NULL;
  32.  
  33. if (filaVazia(f))
  34. f->inicio = novo;
  35. else
  36. f->fim->prox = novo;
  37.  
  38. f->fim = novo;
  39. }
  40.  
  41. // Desenfileira elemento do início
  42. int desenfileirar(Fila* f) {
  43. if (filaVazia(f)) return -1;
  44.  
  45. No* temp = f->inicio;
  46. int valor = temp->id;
  47. f->inicio = temp->prox;
  48.  
  49. if (f->inicio == NULL)
  50. f->fim = NULL;
  51.  
  52. free(temp);
  53. return valor;
  54. }
  55.  
  56. // Função recursiva para remover um elemento específico da fila
  57. No* removerRecursivo(No* atual, int id) {
  58. if (atual == NULL) return NULL; // Caso base
  59.  
  60. if (atual->id == id) {
  61. No* prox = atual->prox;
  62. free(atual);
  63. return prox; // Retorna o próximo nó para religar a lista
  64. }
  65.  
  66. atual->prox = removerRecursivo(atual->prox, id);
  67. return atual;
  68. }
  69.  
  70. // Função para remover um elemento específico (usando recursão)
  71. void removerElemento(Fila* f, int id) {
  72. f->inicio = removerRecursivo(f->inicio, id);
  73.  
  74. // Atualiza o ponteiro 'fim'
  75. if (f->inicio == NULL)
  76. f->fim = NULL;
  77. else {
  78. No* aux = f->inicio;
  79. while (aux->prox != NULL)
  80. aux = aux->prox;
  81. f->fim = aux;
  82. }
  83. }
  84.  
  85. // Exibe os elementos restantes da fila
  86. void imprimirFila(Fila* f) {
  87. No* aux = f->inicio;
  88. while (aux != NULL) {
  89. printf("%d", aux->id);
  90. if (aux->prox != NULL) printf(" ");
  91. aux = aux->prox;
  92. }
  93. printf("\n");
  94. }
  95.  
  96. int main() {
  97. Fila fila;
  98. inicializarFila(&fila);
  99.  
  100. int N, M, id;
  101. scanf("%d", &N);
  102.  
  103. for (int i = 0; i < N; i++) {
  104. scanf("%d", &id);
  105. enfileirar(&fila, id);
  106. }
  107.  
  108. scanf("%d", &M);
  109. int sair;
  110. for (int i = 0; i < M; i++) {
  111. scanf("%d", &sair);
  112. removerElemento(&fila, sair);
  113. }
  114.  
  115. imprimirFila(&fila);
  116. return 0;
  117. }
Success #stdin #stdout 0s 5320KB
stdin
4
10 9 6 3
1
3
stdout
10 9 6