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.

Listagem 77 Comandos do programa de simulação de fila de espera.
 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 strtokListagem 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.

Listagem 78 Atividade principal do programa de simulação de fila de espera.
 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}