
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:
Referência (acessado em 25/08/2016): http://web.unipar.br/~piffer/2Serie(Estrutura)/3bim/10_Fila-dinamica_exemplo_completo.cpp

Nenhum comentário:
Postar um comentário