#include <stdio.h>
#include <stdlib.h>

typedef struct maillon_s {
    char valeur;
    struct maillon_s* suivant;
} maillon;

typedef struct {
    maillon* tete;
    maillon* queue;
} file;

void enqueue_file(file* f, char valeur) {
    maillon* nouveau = (maillon*)malloc(sizeof(maillon));
    if (nouveau == NULL) {
        printf("Erreur: allocation memoire\n");
        exit(EXIT_FAILURE);
    }
    nouveau->valeur = valeur;
    nouveau->suivant = NULL;
    if (f->queue == NULL) {
        f->tete = f->queue = nouveau;
    } else {
        f->queue->suivant = nouveau;
        f->queue = nouveau;
    }
}

char dequeue_file(file* f) {
    if (f->tete == NULL) {
        printf("Erreur: file vide\n");
        return '\0';
    }
    maillon* temp = f->tete;
    char valeur = temp->valeur;
    f->tete = f->tete->suivant;
    if (f->tete == NULL) {
        f->queue = NULL;
    }
    free(temp);
    return valeur;
}

int empty_file(file* f) {
    return f->tete == NULL;
}

int main(void) {
    file f = {NULL, NULL};
    char ordre[2];

    printf("La file attend vos ordres \n > ");
    while (scanf("%1s", ordre) == 1) {
        if (ordre[0] == 'q') {
            printf("Au revoir\n");
            break;
        } else if (ordre[0] == '+') {
            scanf(" %c", &ordre[1]);
            enqueue_file(&f, ordre[1]);
        } else if (ordre[0] == '-') {
            printf("Dequeue: %c\n", dequeue_file(&f));
        } else {
            printf("Commande invalide\n");
        }
        printf("\nLa file attend vos ordres \n > ");
    }

    return EXIT_SUCCESS;
}
