Nesta aula vamos desenvolver uma segunda versão para a implementação da estrutura de dados dinâmica do tipo fila. Agora, além da estrutura Nó, vamos também criar uma estrutura Fila com um ponteiro para o primeiro nó, um ponteiro para o último nó e o tamanho da fila.
Utilizar outra estrutura significa consumir mais memória. Contudo, também significa tornar o código menos complexo. Como o ponteiro para o início da fila estará dentro da estrutura fila, não será necessário mais a utilização de ponteiro para ponteiro.
Agora, nossa estrutura fila será composta de duas estruturas, a estrutura Nó que já conhecemos, e a estrutura fila, assim:
/*
Estruturas para trabalhar com a estrutura de dados do tipo fila encadeada
*/
typedef struct no{
int valor;
struct no *proximo;
}No;
typedef struct{
No *prim;
No *fim;
int tam;
}Fila;
Ao criar uma fila seu estado inicial é vazio. Então, podemos criar um procedimento para isso, inicializando os ponteiros e o tamanho da fila, assim:
/*
Procedimento para inicializar uma estrutura do tipo fila
*/
void criar_fila(Fila *fila){
fila->prim = NULL;
fila->fim = NULL;
fila->tam = 0;
}
Precisamos também alterar o procedimento para inserir um novo elemento na fila. Com um ponteiro para o fim da fila, não precisamos percorrer toda a fila, podemos acessar diretamente o último nó da nossa fila.
/*
Procedimento para inserir um novo nó na fila
*/
void inserir_na_fila(Fila *fila, int num){
No *aux, *novo = malloc(sizeof(No));
if(novo){
novo->valor = num;
novo->proximo = NULL;
if(fila->prim == NULL){ // se a fila estiver vazia
fila->prim = novo;
fila->fim = novo;
}
else{ // se a fila NÃO estiver vazia
fila->fim->proximo = novo; // o próximo do ponteiro fim aponta para o novo nó
fila->fim = novo; // o ponteiro fim aponta para o novo nó
}
fila->tam++;
}
else
printf("\nErro ao alocar memoria.\n");
}
Código completo em C para a segunda versão da estrutura de dados do tipo Fila
/*
Código escrito por Wagner Gaspar
Julho de 2021
Aula 238: Estrutura FILA - Segunda versão
*/
typedef struct no{
int valor;
struct no *proximo;
}No;
typedef struct{
No *prim;
No *fim;
int tam;
}Fila;
void criar_fila(Fila *fila){
fila->prim = NULL;
fila->fim = NULL;
fila->tam = 0;
}
void inserir_na_fila(Fila *fila, int num){
No *aux, *novo = malloc(sizeof(No));
if(novo){
novo->valor = num;
novo->proximo = NULL;
if(fila->prim == NULL){
fila->prim = novo;
fila->fim = novo;
}
else{
fila->fim->proximo = novo;
fila->fim = novo;
}
fila->tam++;
}
else
printf("\nErro ao alocar memoria.\n");
}
No* remover_da_fila(Fila *fila){
No *remover = NULL;
if(fila->prim){
remover = fila->prim;
fila->prim = remover->proximo;
fila->tam--;
}
else
printf("\tFila vazia\n");
return remover;
}
void imprimir(Fila *fila){
No *aux = fila->prim;
printf("\t------- FILA --------\n\t");
while(aux){
printf("%d ", aux->valor);
aux = aux->proximo;
}
printf("\n\t------- FIM FILA --------\n");
}
int main(){
No *r;
Fila fila;
int opcao, valor;
criar_fila(&fila);
do{
printf("\t0 - Sair\n\t1 - Inserir\n\t2 - Remover\n\t3 - Imprimir\n");
scanf("%d", &opcao);
switch(opcao){
case 1:
printf("Digite um valor: ");
scanf("%d", &valor);
inserir_na_fila(&fila, valor);
break;
case 2:
r = remover_da_fila(&fila);
if(r){
printf("Removido: %d\n", r->valor);
free(r);
}
break;
case 3:
imprimir(&fila);
break;
default:
if(opcao != 0)
printf("\nOpcao invaluda!\n");
}
}while(opcao != 0);
return 0;
}
