Dando continuidade ao nosso Curso de Programação C, nesta aula vamos aprender como implementar a estrutura de dados fila de prioridade.
Como exemplo vamos simular uma fila de prioridade por idade semelhante às tantas filas que vemos no dia a dia. Assim, se a pessoa a ser inserida tiver uma idade menor que 60 anos, então ela será inserido no final da fila, caso contrário, será inserida no início da fila após a última prioridade, caso já exista alguma.
No trecho de código a seguir implementamos esse processo. Alocamos um novo Nó e verificamos se a fila está vazia. Caso a fila esteja vazia, então este novo nó será o primeiro nó da fila. Contudo, se a fila não estiver vazia, precisamos então verificar se o elemento a ser inserido é uma prioridade.
Se o novo nó for uma prioridade, perceba que ainda existem duas possibilidades: pode ser que esta seja a primeira prioridade, então teremos uma inserção no início da fila; ou pode ser que já exista alguma prioridade na fila, então teremos uma inserção no meio da fila, após a última prioridade.
Caso não seja uma prioridade, basta percorrer a fila até o final e inserir o novo nó. Perceba que esta inserção poderia ser direta se existisse um ponteiro para o fim da fila, dispensando a necessidade de caminhar na fila até o final.
/* Função para inserir com prioridade por idade */ void inserir_com_prioridade(No **fila, int num){ No *aux, *novo = malloc(sizeof(No)); if(novo){ novo->valor = num; novo->proximo = NULL; if(*fila == NULL) // a fila está vazia? *fila = novo; else{ if(num > 59){ // é prioridade? if((*fila)->valor < 60){ // é a primeira prioridade? novo->proximo = *fila; // insere no início da fila *fila = novo; } else{ aux = *fila; while(aux->proximo && aux->proximo->valor > 59) aux = aux->proximo; novo->proximo = aux->proximo; // insere depois da última prioridade aux->proximo = novo; } } else{ // não é prioridade, então insere no final aux = *fila; while(aux->proximo) aux = aux->proximo; aux->proximo = novo; } } } else printf("\nErro ao alocar memoria.\n"); }
Código completo em C para uma Fila de Prioridade por Idade
/* Código escrito por Wagner Gaspar Agosto de 2021 Aula 241: FILA de Prioridade */ typedef struct no{ int valor; struct no *proximo; }No; void inserir_na_fila(No **fila, int num){ No *aux, *novo = malloc(sizeof(No)); if(novo){ novo->valor = num; novo->proximo = NULL; if(*fila == NULL) *fila = novo; else{ aux = *fila; while(aux->proximo) aux = aux->proximo; aux->proximo = novo; } } else printf("\nErro ao alocar memoria.\n"); } void inserir_com_prioridade(No **fila, int num){ No *aux, *novo = malloc(sizeof(No)); if(novo){ novo->valor = num; novo->proximo = NULL; if(*fila == NULL) *fila = novo; else{ // é prioridade? if(num > 59){ if((*fila)->valor < 60){ // é a primeira prioridade? novo->proximo = *fila; // insere no início da fila *fila = novo; } else{ aux = *fila; while(aux->proximo && aux->proximo->valor > 59) aux = aux->proximo; novo->proximo = aux->proximo; // insere depois da última prioridade aux->proximo = novo; } } else{ aux = *fila; while(aux->proximo) aux = aux->proximo; aux->proximo = novo; } } } else printf("\nErro ao alocar memoria.\n"); } No* remover_da_fila(No **fila){ No *remover = NULL; if(*fila){ remover = *fila; *fila = remover->proximo; } else printf("\tFila vazia\n"); return remover; } void imprimir(No *fila){ printf("\t------- FILA --------\n\t"); while(fila){ printf("%d ", fila->valor); fila = fila->proximo; } printf("\n\t------- FIM FILA --------\n"); } int main(){ No *r, *fila = NULL; int opcao, valor; do{ printf("\t0 - Sair\n\t1 - Inserir\n\t2 - Remover\n\t3 - Imprimir\n\t4 - inserir com prioridade\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; case 4: printf("Digite um valor: "); scanf("%d", &valor); inserir_com_prioridade(&fila, valor); break; default: if(opcao != 0) printf("\nOpcao invaluda!\n"); } }while(opcao != 0); return 0; }