#C - Fila Dinâmica (FIFO)


Para entender o que é uma Fila Dinâmica devemos nos basear em uma fila de cinema, o primeiro que entra na fila é o primeiro que sai dela, como você já deve ter percebido ela é diferente da pilha, Porém apesar de seu conceito ser diferente, seu código é parecido.

Vamos começar fazendo o inicio do código.
-Código:
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <string.h>
# include <malloc.h>

struct elemento {
int dados; // Variável que irá conter o valor do item.
struct elemento *prox; // Ponteiro que irá apontar para o próximo item da fila.
};

struct fila {
struct elemento *inicio; // Ponteiro que irá apontar para o inicio da fila.
struct elemento *final; // Ponteiro que irá apontar para o inicio da fila.
};

int fi_liberada=0; // Variável Inteira que verifica se a Fila está liberada.
typedef struct fila Fila; // Definimos o nome Fila para a struct fila.

----- Funções -----

Cria_Fila - Função utilizada para iniciar uma fila.
-Código:
Fila* Cria_Fila(int liberada){
  if (liberada != 0){ // Verifica se a Fila está liberada.
  puts("Ja existe uma Fila criada");
    getche();
    return NULL;  
  }else{
      Fila *fi = (Fila*) malloc (sizeof(Fila)); // Aloca um espaço de memória para a Fila.
      if (fi == NULL){
       puts("Nao foi possivel criar a fila por falta de espaço"); // Sem comentários.
 } else{
          fi->final = NULL; // Define o final da Fila como nulo.
          fi->inicio = NULL; // Define o começo da Fila como nulo.
          printf("\nFila Criada apontando para %p", fi);
          fi_liberada = 1; // Define que já existe uma Fila criada.
      }
      getche();
      return fi; // Retorna a Fila.
   }
}

Libera_Fila - Função utilizada para liberar (limpar/excluir) uma fila.
-Código:
int Libera_Fila(Fila *fi){
  if (fi != NULL){ // Caso Fila não seja nula.
     elemento *no; // Novo Ponteiro.
     while (fi->inicio != NULL){ // Caso o inicio não seja nulo.
         no = fi->inicio; // Nó aponta para FI - Inicio.
         printf("\n dados = %i", fi->inicio->dados);
         fi->inicio = fi->inicio->prox; // Fi inicio aponta para Fi Inicio Prox.
         free(no); // Nó deleta e libera o inicio.
     }
     printf("\n%s", *fi);  
     fi = NULL; // Fila é definida como nula.
     free(fi); // Liberamos a Fila.
     fi_liberada = 0; // Definimos que não existe Fila criada.
     return 1; // Fila liberada.
  }else{
     return 0; // Fila não existe.
  }
}

Tamanho_Fila - Função que conta e guarda e retorna o tamanho da fila.
-Código:
int Tamanho_Fila(Fila *fi){
  if (fi == NULL) // Caso a Fila for nula.
     return 0;        // A Fila não foi criada.
  if (fi->inicio == NULL) // Caso a fila não for nula.
     return -1;       // A Fila esta vazia.
  int cont = 0; // Variável Contadora.
  elemento *no = fi->inicio; // Nó recebe Fi - Inicio.
  while(no != NULL){ // Enquanto nó não for nulo.
    cont++; // Contador aumenta.
    no = no->prox; // Nó vai para a próxima posição.
  }
  return cont;   // Retorna o tamanho da fila.
}

Insere_Fila - Função que tem o objetivo de inserir um item na fila.
-Código:
int Insere_Fila(Fila *fi, int dad){ // Recebe o parâmetro de Fila e o item Dad (dados).
  if (fi == NULL) // Caso a fila seja Nula.
     return 0;    //A Fila nao foi criada.
  elemento *no = (elemento*) malloc (sizeof(elemento)); // Aloca espaço de memória para o ponteiro Nó.
  if (no == NULL)
     return 2;    //Erro - A Fila nao foi criada.
  no->dados = dad; // Nó recebe o conteúdo digitado.
  no->prox = NULL; // Nó define prox como nulo.
  if (fi->final == NULL){ // Caso o final da fila seja nulo.
     fi->inicio = no; // Define o inicio da fila como o Nó.
  }else{
     fi->final->prox = no; // Aponta o prox para o Nó.
  }
  fi->final = no; // Define o Fim da fila como o Nó.
  return 1;     // Elemento inserido com sucesso no final da Fila.
}

Remove_Fila - Função que tem como objetivo retirar algum item da fila.
-Código:
int Remove_Fila(Fila *fi){ // Recebe a fila.
  if (fi == NULL)
     return 0;   //A Fila nao existe.
  if (fi->inicio == NULL)
     return 2;   //A Fila esta vazia.
  printf("%p", fi);
  getche();
  elemento *no = fi->inicio; // Nó aponta para o inicio da fila.
  fi->inicio = fi->inicio->prox; // Inicio da fila aponta para a proxima posição.
  if (fi->inicio == NULL) // Caso o inicio seja nulo.
     fi->final = NULL;   // O final também será nulo.
  free(no); // Liberamos o Nó.
  return 1;   // Elemento removido com sucesso do inicio da Fila.
}

Consulta_Inicio_Fila - Função que consulta e recebe o primeiro item na fila.
-Código:
int Consulta_Inicio_Fila(Fila *fi, int dad){ // Recebe a fila e o Dad.
  if (fi == NULL)
     return 0;    //A Fila não existe.
  if (fi->inicio == NULL)
     return 2;   //A Fila esta vazia.
  dad = fi->inicio->dados; // Dad recebe os dados do inicio da fila.
  printf("\n dados = %i", dad);
  getche();
  return 1;  // Encontrado o elemento da Fila.
}

Pronto agora já acabamos de fazer as funções, irei mostrar um exemplo de como iniciar a fila.
-Código:
int main(){
  Fila *fi = NULL;  // Armazena o topo da Fila.
  int z=0, x, dados;
  fi = Cria_Fila(fi_liberada);  
  z++;
dados = z;
x = Insere_Fila(fi, dados); // Insere dados na fila.
if (x == 0){
puts("A Fila nao foi criada ou faltou espaço");
z=0;
}else{
  if (x == 2){
puts("A Fila esta vazia");
z=0;
  }else{
 puts("Elemento colocado no FINAL da Fila com sucesso!");
   printf("\ndados = %i", dados);
  }
   }
return 0;
}

Basicamente é isto, agora você pode pegar as funções acima e ir fazendo a sua Fila de acordo com sua necessidade. Irei deixar um video aqui abordando o mesmo assunto, caso queiram assistir para entender melhor:



Nenhum comentário:

Postar um comentário