#include <stdio.h>

#include <stdlib.h>

#include <string.h>



typedef struct Cliente {

    char nome[100];

    struct Cliente* proximo;

} Cliente;



void cadastrarCliente(Cliente** inicio, Cliente** fim, char* nome) {

    Cliente* novoCliente = (Cliente*)malloc(sizeof(Cliente));



    strncpy(novoCliente->nome, nome, sizeof(novoCliente->nome));

    novoCliente->proximo = NULL;



    if (*inicio == NULL) {

        *inicio = novoCliente;

        *fim = novoCliente;

    } else {

        (*fim)->proximo = novoCliente;

        *fim = novoCliente;

    }



    printf("Cliente '%s' cadastrado na fila de espera.\n", novoCliente->nome);

}



void retirarCliente(Cliente** inicio) {

    if (*inicio == NULL) {

        printf("A fila de espera está vazia.\n");

        return;

    }



    Cliente* cliente = *inicio;



    *inicio = (*inicio)->proximo;



    printf("Cliente '%s' chamado para atendimento.\n", cliente->nome);



    free(cliente);

}



void exibirFila(Cliente* inicio) {

    if (inicio == NULL) {

        printf("A fila de espera está vazia.\n");

        return;

    }



    printf("Fila de espera:\n");

    Cliente* cliente = inicio;

    while (cliente != NULL) {

        printf("- %s\n", cliente->nome);

        cliente = cliente->proximo;

    }

}



int main() {

    Cliente* inicio = NULL;

    Cliente* fim = NULL;



    int opcao;

    char nome[100];



    do {

        printf("\n=== Sistema de Atendimento ao Cliente ===\n");

        printf("1. Cadastrar novo cliente na fila de espera\n");

        printf("2. Chamar próximo cliente para atendimento\n");

        printf("3. Exibir fila de espera\n");

        printf("4. Sair\n");

        printf("Escolha uma opção: ");

        scanf("%d", &opcao);



        switch (opcao) {

            case 1:

                printf("Digite o nome do cliente: ");

                scanf("%s", nome);

                cadastrarCliente(&inicio, &fim, nome);

                break;

            case 2:

                retirarCliente(&inicio);

                break;

            case 3:

                exibirFila(inicio);

                break;

            case 4:

                printf("Encerrando o programa.\n");

                break;

            default:

                printf("Opção inválida. Tente novamente.\n");

                break;

        }

    } while (opcao != 4);



    Cliente* cliente = inicio;

    while (cliente != NULL) {

        Cliente* proximoCliente = cliente->proximo;

        free(cliente);

        cliente = proximoCliente;

    }



    return 0;

}