Programa de simulação de fila de espera
O estudo da estrutura de dados lista ligada em linguagem C, aqui apresentado, vai ser suportado num programa de aplicação que simula uma fila de espera de utentes para um serviço.
A fila de espera é representada por uma lista ligada em que cada elemento da lista corresponde a um utente na fila.
São realizadas várias versões do programa para exemplificar a utilização de diversos tipos de lista e técnicas de programação em linguagem C.
Na perpetiva do utilizador, o programa tem o mesmo comportamento em todas as versões. A atividade principal do programa, consiste em realizar ciclos sucessivos de aceitação e execução de comandos.
Os comandos disponíveis são os mostrados na função help.
O utilizador identifica o comando através de uma letra,
eventualmente seguida de um argumento.
1static void help()
2{
3 printf("Comandos:\n"
4 " S - Sair do programa\n"
5 " H - Mostrar lista de comando\n"
6 " N <name> - Chegada de novo utente\n"
7 " D <name> - Desistencia de utente\n"
8 " L - Listar fila de espera\n"
9 " A - Atender utente\n");
10}
A letra identificadora do comando e o argumento são isolados utilizando a função
strtok – Listagem 78 linhas 7 e 10.
Considera-se que o utilizador escreve sempre bem a entrada de comando.
A manipulação da lista ligada é realizada nas funções de execução dos comandos
(user_insert, user_remove, user_answer, etc).
A utilização de diferentes listas ligadas concretiza-se em diferentes
realizações destas funções.
1int main()
2{
3 char line[100];
4 while (true) {
5 if (fgets(line, sizeof(line), stdin) == NULL)
6 return EXIT_FAILURE;
7 char *command = strtok(line, " \n");
8 if (command == NULL)
9 continue;
10 char *name = strtok(NULL, " \n");
11 switch (toupper(*command)) {
12 case 'S':
13 user_delete_queue();
14 return EXIT_FAILURE;
15 case 'H':
16 help();
17 break;
18 case 'N':
19 user_insert(name);
20 break;
21 case 'D':
22 user_remove(name);
23 break;
24 case 'L':
25 user_print();
26 break;
27 case 'A':
28 name = user_answer();
29 if (NULL == name) {
30 printf("Fila vazia\n");
31 }
32 else {
33 printf("Atender %s\n", name);
34 free(name);
35 }
36 break;
37 }
38 }
39}