fifo.c
#include<stdlib.h>
#include<stdio.h>
typedef struct s_Item *Item_t;
typedef struct s_Item {
int content;
Item_t next;
Item_t prev;
} s_Item_t;
typedef struct FIFO {
int count;
Item_t head;
Item_t tail;
} FIFO_t;
Item_t newItem(int valeur) {
Item_t res = malloc(sizeof(s_Item_t));
res->prev=NULL;
res->next=NULL;
res->content=valeur;
return res;
}
void freeItem(Item_t b) {
free(b);
}
FIFO_t newFIFO() {
FIFO_t fifo;
fifo.count = 0 ;
fifo.head = NULL ;
fifo.tail = NULL ;
return fifo;
}
void freeFIFO(FIFO_t l) {
Item_t current,next;
for (current=l.head;current;current=next) {
next=current->next;
freeItem(current);
}
}
/* L'insertion se fait à la fin de la liste : on va faire la queue comme
tout le monde quoi...
Voici à quoi ressemble une file...
_____[head,tail]____
| |
V V
[1]<-->[2]<-->[3]<-->[4]
*/
void insert(FIFO_t *l, int t) {
Item_t new;
(l->count)++;
new=newItem(t);
if (l->head == NULL) {
l->head=new;
l->tail=new;
} else {
new->prev=l->tail;
new->prev->next=new;
l->tail=new;
}
}
/* On récupère les données en tête : premiers arrivés, premiers servis !!! */
int extract(FIFO_t *l) {
Item_t item;
int content;
if (l->head==NULL) {
printf("Attention, on essaye d'extraire un élément d'une file vide !!!\n");
exit(1);
}
item=l->head;
content=item->content;
l->head=item->next;
if (l->head==NULL)
l->tail=NULL;
else
l->head->prev=NULL;
freeItem(item);
(l->count)--;
return content;
}
/*
* getFirstValue()
*/
Item_t getFirstItem(FIFO_t l) {
return l.head;
}
int main() {
FIFO_t my_fifo = newFIFO();
int i,j;
for(i=0;i<10;i++) {
insert(&my_fifo, i);
}
for(i=0;i<10;i++) {
j=extract(&my_fifo);
printf("%d\n",j);
}
for(i=0;i<10;i++) {
insert(&my_fifo, i);
}
for(i=0;i<11;i++) {
j=extract(&my_fifo);
printf("%d\n",j);
}
return 0;
}
Generated by GNU enscript 1.6.2.