Meu código ainda está em andamento, implementei na função de mostrar a fila uma forma de mostrar as prioridades primeiro, porém ainda não pensei na forma de retirar as prioridades primeiro na hora de chamar a função retirar. Quem tiver alguma ideia de como implementar isso... estou aceitando!
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
struct Eleitor {
int idade;
char nome[30];
int prioridade;
};
struct Item {
Eleitor eleitor;
struct Item *proximo;
};
struct Fila {
Item *inicio;
Item *fim;
};
void Inicializar(Fila **fila) {
// -> Recebe a fila por referencia
// para inicializá-la
*fila = (Fila *) malloc(sizeof(Fila));
(*fila)->inicio = NULL;
(*fila)->fim = NULL;
}
int EstaVazia(Fila *fila) {
return fila->inicio == NULL;
}
void Inserir(Fila *fila, Eleitor elemento) {
Item *novo;
novo = (Item *)malloc(sizeof(Item));
// -> Verifica se a memória foi alocada com sucesso
if (novo != NULL) {
strcpy(novo->eleitor.nome, elemento.nome);
novo->eleitor.idade = elemento.idade;
novo->eleitor.prioridade = elemento.prioridade;
novo->proximo = NULL;
if(EstaVazia(fila)) {
// -> Primeiro Item da Fila.
fila->inicio = novo;
fila->fim = novo;
} else {
// -> Ultimo item da Fila
fila->fim->proximo = novo;
fila->fim=novo;
}
}
}
void Retirar(Fila *fila) {
Item *item;
if(!EstaVazia(fila)) {
item = fila->inicio;
fila->inicio = item->proximo;
free(item);
// -> Se a fila acabou devemos atualizar o final
if (fila->inicio == NULL)
fila->fim = NULL;
}
}
void MostrarFila(Fila *fila) {
int i = 0;
Item *item;
system("cls");
printf("# Fila de eleitores #\n\n");
printf("---------------------------------\n");
if (EstaVazia(fila)) {
printf ("Nao ha eleitores na fila!\n");
} else {
item = fila->inicio;
i = 1;
while(item != NULL) {
if (item->eleitor.prioridade == 1) {
printf("[%i] -> Idade: %i | Nome: %s\n", i, item->eleitor.idade, item->eleitor.nome);
i++;
}
item = item->proximo;
}
item = fila->inicio;
while (item != NULL) {
if (item->eleitor.prioridade == 0) {
printf("[%i] -> Idade: %i | Nome: %s\n", i, item->eleitor.idade, item->eleitor.nome);
i++;
}
item = item->proximo;
}
}
printf("---------------------------------\n");
}
void Menu() {
printf("# Tribunal Eleitoral #\n\n(1) Adicionar eleitor \n(2) Atender eleitor \n(3) Listar eleitores na fila\n(4) Finalizar atendimento \nEscolha a opcao desejada: ");
}
int main() {
Fila *fila = NULL;
int opcao;
Eleitor eleitor;
Inicializar(&fila);
Menu();
scanf("%i", &opcao);
while (opcao != 4) {
switch (opcao) {
case 1:
system("cls");
printf("# Adicionar eleitor #\n\n");
printf("Insira a idade do eleitor: ");
scanf("\n%i", &eleitor.idade);
printf("Insira o nome do eleitor: ");
scanf("\n%s", &eleitor.nome);
if (eleitor.idade >= 65) {
eleitor.prioridade = 1;
} else {
eleitor.prioridade = 0;
}
Inserir(fila, eleitor);
printf("\nO eleitor foi inserido na fila com sucesso!\n\n");
system("pause");
system("cls");
Menu();
break;
case 2:
Retirar(fila);
system("cls");
printf("Primeiro eleitor da fila atendido com sucesso!\n\n");
system("pause");
system("cls");
Menu();
break;
case 3:
MostrarFila(fila);
system("pause");
system("cls");
Menu();
break;
default:
system("cls");
printf("Escolha invalida!\n\n");
Menu();
break;
}
scanf("%i", &opcao);
}
}