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.