Tarefa 8 - Fila à Brasileira

Prazo de entrega recomendado:

Você deverá realizar operações em uma fila, implementada como lista ligada.


Um grupo de sociológos está investigando a fila de entrada na boate mais badalada da cidade. O objetivo é demonstrar que a fila de entrada de espaços prestigiados no Brasil não funciona exatamente como esperaríamos: nem sempre quem chega primeiro, entra primeiro.

Nessa boate em particular, cada pessoa na fila é identificada pelo número de seu documento. A primeira pessoa a chegar recebe uma lanterna para facilitar que outras pessoas vejam a fila nas noites mais escuras. Assim, para entrar na fila, você deve procurar a pessoa que está segurado a lanterna, entrar atrás dela e tomar a lanterna para você. Se três pessoas chegarem em sequência, a fila deveria ficar como a na figura abaixo.

Até então não há nada diferente de qualquer outra fila, mas os sociólogos descobriram três fenômenos muito recorrentes, como se fossem regrinhas não escritas.

  1. Se quem estiver entrando na fila for filho de algum político, ex-BBB, youtuber de finanças, coach ou herdeiro de um fortuna, ela toma a lanterna para si, mas ao invés entrar atrás de quem entregou a lanterna, entra no início da fila. Ninguém reclama. Veja na figura abaixo o que acontece com a fila quando o herdeiro 3 chega, seguidos de seus amigos 4 e 5, esses pessoas comuns.

  2. Um dos benefícios do contrato de trabalho na boate é que funcionários não pagam pela entrada. O que os sociólogos descobriram, no entanto, é que quando um funcionário entra na fila, ele deve se dirigir ao final, independentemente de onde está a lanterna. Na figura seguinte, quando o funcionário 5 recebe a lanterna da pessoa 4, ela vai direto pro final da fila.

  3. Em tempos de pandemia, para entrar na boate todos deveriam estar vacinados, mas nem sempre isso é respeitado. O que acontece de fato é que, quando um fiscal entra na fila, quem ficar logo atrás do fiscal e não estiver vacinado sai da fila para não ser multado. Na figura abaixo, o fiscal 8 acabou de entrar na fila e as pessoas 1, 2 e 4 não estão vacinadas. Assim, a pessoa 1 fica logo atrás do fiscal e sai. Em seguida, a pessoa 2 fica logo atrás do fiscal e também sai. Depois disso, a pessoa 3 fica logo atrás do fiscal, mas não faz nada porque está vacinada. A pessoa 4 não está vacinada, mas como está longe do fiscal, ela não se preocupa. Se alguém não vacinado chegar na fila atrás de um fiscal, ele nem entra na fila e a lanterna continua com o fiscal.

Sua tarefa é colaborar com o estudo e implementar um programa boate.c que simula a fila dessa boate.

Entrada

Cada linha da entrada corresponde a uma pessoa que está entrando na fila, na ordem de chegada. Uma linha tem três campos: número do documento (inteiro), nome da profissão (string sem espaços com no máximo 25 caracteres) e o estado de vacinação da pessoa (vacinado ou nao-vacinado).

As profissões que entram no começo da fila são identificadas pelas strings coach, ex-bbb, filho-politico, herdeiro, youtuber-financas e um funcionário é identificado pela string funcionario.

Dica: para ler as linhas até o final do arquivo, utilize o fato de que scanf devolve um número constante EOF representando o final de arquivo (end of file), como no exemplo seguinte:

while (scanf(...) != EOF) { ... }

Exemplo de entrada

97615 funcionario vacinado
97666 funcionario nao-vacinado
13704 funcionario vacinado
55033 youtuber-financas nao-vacinado
58366 funcionario vacinado
45619 herdeiro nao-vacinado
52213 funcionario nao-vacinado
75608 youtuber-financas vacinado
36149 herdeiro nao-vacinado
45161 ex-bbb nao-vacinado
88657 coach nao-vacinado
82684 youtuber-financas nao-vacinado
27754 funcionario nao-vacinado
13700 funcionario nao-vacinado
61881 youtuber-financas vacinado
93203 funcionario vacinado
86628 coach vacinado
70393 funcionario nao-vacinado
57012 funcionario vacinado
35228 funcionario vacinado

Saída

A saída deve conter a configuração final da fila de acordo com as regras explicadas.

Exemplo de saída

86628 coach vacinado
61881 youtuber-financas vacinado
82684 youtuber-financas nao-vacinado
88657 coach nao-vacinado
45161 ex-bbb nao-vacinado
36149 herdeiro nao-vacinado
75608 youtuber-financas vacinado
45619 herdeiro nao-vacinado
55033 youtuber-financas nao-vacinado
97615 funcionario vacinado
97666 funcionario nao-vacinado
13704 funcionario vacinado
58366 funcionario vacinado
52213 funcionario nao-vacinado
27754 funcionario nao-vacinado
13700 funcionario nao-vacinado
93203 funcionario vacinado
70393 funcionario nao-vacinado
57012 funcionario vacinado
35228 funcionario vacinado

Critérios

É obrigatório utilizar listas ligadas nessa tarefa. Se desejar, separe sua implementação de fila utilizando arquivos fila.h e fila.c, neste caso atualize seu Makefile. Para passar na tarefa é necessário implementar pelo menos a primeira regra identificada pelos sociólogos. Lembre-se de liberar toda a memória alocada dinamicamente, utilize o valgrind para garantir que nada ficou alocado.

Correção

Esta tarefa será corrigida automaticamente sempre que você realizar um git push. Depois de terminada a tarefa, deve-se utilizar o botão na interface de notas para solicitar a correção de um monitor.

Turma AB: O peso desta tarefa será 3.