// fifo.c
// << Algorithmique du texte >>
// Maxime Crochemore, Christophe Hancart et Thierry Lecroq
// Vuibert, 2001.
#include <stdio.h>
#include "cellule.h"
#include "fifo.h"
File fileVide() {
File F;
F = (File)malloc(sizeof(struct _file));
if (F == NULL) error("fileVide");
F->longueur = 0;
F->tete = F->queue = NULL;
return(F);
}
int longueur(File F) {
if (F == NULL) error("longueur");
return(F->longueur);
}
void enfiler(File F, void *element) {
Cellule cellule;
if (F == NULL) error("enfiler");
cellule = (Cellule)malloc(sizeof(struct _cellule));
if (cellule == NULL) error("enfiler");
cellule->element = element;
cellule->suivant = NULL;
if (longueur(F) == 0)
F->tete = F->queue = cellule;
else {
F->queue->suivant = cellule;
F->queue = cellule;
}
++(F->longueur);
}
void *tete(File F) {
if (F == NULL || longueur(F) == 0) error("tete");
return(F->tete->element);
}
void defiler(File F) {
Cellule cellule;
if (F == NULL || longueur(F) == 0) error("defiler");
cellule = F->tete;
if (longueur(F) == 1)
F->tete = F->queue = NULL;
else
F->tete = F->tete->suivant;
--(F->longueur);
free(cellule);
}
void *defilement(File F) {
Cellule cellule;
void *element;
if (F == NULL || longueur(F) == 0) error("defilement");
cellule = F->tete;
element = cellule->element;
if (longueur(F) == 1)
F->tete = F->queue = NULL;
else
F->tete = F->tete->suivant;
free(cellule);
--(F->longueur);
return(element);
}
File copie(File F) {
File G, H;
Cellule cellule;
if (F == NULL) error("copie");
H = fileVide();
cellule = F->tete;
while (cellule != NULL) {
enfiler(H, cellule->element);
cellule = cellule->suivant;
}
G = fileVide();
cellule = H->tete;
while (cellule != NULL) {
enfiler(G, cellule->element);
cellule = cellule->suivant;
}
return(G);
}
void ecrireFile(File F) {
Cellule cellule;
if (F == NULL) error("ecrireFile");
cellule = F->tete;
while (cellule != NULL) {
printf("%d ", *(int *)cellule->element);
cellule = cellule->suivant;
}
printf("\n");
}