1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| #include <stdio.h>
#include <stdlib.h>
// la file circulaire
typedef struct
{
int * base; // base de la File
int * first; // adresse du premier entré
int * last; // adresse du dernier
int content; // nombre en attente
int max; // capacité maximum
}FileCirc ;
// constructeur
void init (FileCirc * Q, int M)
{
Q->base = (int *) malloc (M*sizeof(int));
Q->first=Q->base;
Q->last=Q->base;
Q->content=0;
Q->max=M;
}
// adresse du n-ième élément
int * pelement (int n, FileCirc * Q)
{
if ((Q->first + n)<(Q->base+Q->max))
return Q->first+n;
else
return Q->first+n-Q->max;
}
// Ajouter un élément (enfiler)
void qstore (int u, FileCirc * Q)
{
if (Q->content==Q->max)
return; // file pleine
else
{
Q->content++;
*Q->last=u;
Q->last=Q->last+1;
if (Q->last >= (Q->base+Q->max))
Q->last=Q->base;
}
}
// Traiter le premier (défiler)
int qretrieve (FileCirc *Q)
{
int x;
if (!Q->content)
return -100000000; // valeur hors norme pour file vide
else
{
x=*Q->first;
Q->content--;
Q->first=(Q->first+1);
if (Q->first >=(Q->base+Q->max))
Q->first=Q->base;
return x;
}
}
// échange les valeurs de rang m et n
void exchange(int m, int n, FileCirc *Q)
{
int x= *pelement(m,Q);
int y=*pelement(n,Q);
*pelement(m,Q)=y;
* pelement(n,Q)=x;
}
// renverse la file
void reverse (FileCirc *Q)
{ int i;
for (i=0; i<=Q->content/2;i++)
exchange(i,Q->content-1-i,Q);
}
// voir la file
void show (FileCirc *Q)
{
int i;
for (i=0;i<Q->content;i++)
printf("%d " , *pelement(i,Q));
printf("\n");
}
int main()
{
FileCirc F;
init(&F,10);
qstore (1,&F);
qstore (2,&F);
qstore (3,&F);
show(&F);
reverse(&F);
show(&F);
return 0;
} |
Partager