Fila dinâmica

Declarando a fila

#include <stdio.h>
#include<stdlib.h>

typedef struct{
    int chave;
} REGISTRO;

typedef struct item{
    REGISTRO r;
    struct item* prox;
} ITEM;

typedef struct{
    ITEM *inicio;
    ITEM *fim;
    int qtde;
} FILA;

*️⃣ Funções de manipulação da fila

Inicializando a fila estática

void inicializar(FILA *f){
    f->inicio = NULL;
    f->fim = NULL;
    f->qtde = 0;
}

Inserindo um item na fila

void inserir(FILA *f, REGISTRO r){
    ITEM *novo = criarItem(r);
    if(novo){
        if(!f->inicio){
            f->inicio = novo;
        }
        else if(f->fim){
            f->fim->prox = novo;
        }
        f->fim = novo;
        f->qtde++;
    }
}

Removendo item da fila

void remover(FILA *f){
    if(f->inicio){
        ITEM *excluir = f->inicio;
        f->inicio = f->inicio->prox;
        free(excluir);
        f->qtde--;
    }
}

Imprimindo a fila

A lógica de impressão da fila pode ser um pouco diferente daquela a que estamos acostumados. Aqui, a variável i do laço de repetição não indica a posição a ser impressa, mas representa cada item existente na fila.

void imprimir(FILA *f){
    ITEM* pos = f->inicio;
    while(pos){
        printf("%d\n", pos->r.chave);
        pos = pos->prox;
    }
}

🧑🏻‍💻 Testando a fila

int main(void){
    FILA f;
    inicializarFila(&f);
    inserir(&f, (REGISTRO){10});
    inserir(&f, (REGISTRO){20});
    inserir(&f, (REGISTRO){30});
    inserir(&f, (REGISTRO){40});
    imprimir(f);
    remover(&f);
    remover(&f);
    inserir(&f, (REGISTRO){50});
    imprimir(f);
}