Les fichiers en tableaux circulaires (ou files d’attente circulaires ) sont des structures de données utiles pour gérer les opérations de type FIFO (First In, First Out) avec une mémoire fixe. Ce guide vous montre comment créer une f
Un fichier est une structure de données où :
Voici la structure de base pour un fichier en tableau circulaire
typedef struct {
int *data; // Tableau dynamique pour stocker les éléments
int capacity; // Capacité maximale du tableau
int head; // Indice du premier élément
int tail; // Indice du prochain emplacement d'insertion
int size; // Nombre d'éléments actuels dans la file
} CircularQueue;
Créez une fonction pour initialiser le fichier avec une capacité donnée :
#include <stdio.h>
#include <stdlib.h>
void initializeQueue(CircularQueue *queue, int capacity) {
queue->data = (int *)malloc(capacity * sizeof(int));
if (queue->data == NULL) {
printf("Erreur d'allocation mémoire.\n");
exit(1);
}
queue->capacity = capacity;
queue->head = 0;
queue->tail = 0;
queue->size = 0;
}
Ajoutez un élément au fichier. Assurez-vous que le fichier n’est pas plein
int enqueue(CircularQueue *queue, int value) {
if (queue->size == queue->capacity) {
return -1; // La file est pleine
}
queue->data[queue->tail] = value;
queue->tail = (queue->tail + 1) % queue->capacity; // Gestion circulaire
queue->size++;
return 0;
}
Retirez un élément du fichier. Assurez-vous que le fichier
int dequeue(CircularQueue *queue, int *value) {
if (queue->size == 0) {
return -1; // La file est vide
}
*value = queue->data[queue->head];
queue->head = (queue->head + 1) % queue->capacity; // Gestion circulaire
queue->size--;
return 0;
}
Ajouter des fonctions pour vérifier si le fichier
int isQueueFull(CircularQueue *queue) {
return queue->size == queue->capacity;
}
int isQueueEmpty(CircularQueue *queue) {
return queue->size == 0;
}
Libérez la mémoire allouée pour le fichier lorsque vous avez terminé son utilisation :
void freeQueue(CircularQueue *queue) {
free(queue->data);
queue->data = NULL;
queue->capacity = queue->head = queue->tail = queue->size = 0;
}
Voici un programme complet pour un fichier en tableau circulaire avec toutes les opérations :
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *data; // Tableau pour stocker les éléments
int capacity; // Capacité maximale
int head; // Indice du premier élément
int tail; // Indice du prochain emplacement d'insertion
int size; // Nombre d'éléments actuels
} CircularQueue;
// Initialisation de la file
void initializeQueue(CircularQueue *queue, int capacity) {
queue->data = (int *)malloc(capacity * sizeof(int));
if (queue->data == NULL) {
printf("Erreur d'allocation mémoire.\n");
exit(1);
}
queue->capacity = capacity;
queue->head = 0;
queue->tail = 0;
queue->size = 0;
}
// Ajouter un élément à la file
int enqueue(CircularQueue *queue, int value) {
if (queue->size == queue->capacity) {
return -1; // La file est pleine
}
queue->data[queue->tail] = value;
queue->tail = (queue->tail + 1) % queue->capacity; // Gestion circulaire
queue->size++;
return 0;
}
// Retirer un élément de la file
int dequeue(CircularQueue *queue, int *value) {
if (queue->size == 0) {
return -1; // La file est vide
}
*value = queue->data[queue->head];
queue->head = (queue->head + 1) % queue->capacity; // Gestion circulaire
queue->size--;
return 0;
}
// Vérifier si la file est pleine
int isQueueFull(CircularQueue *queue) {
return queue->size == queue->capacity;
}
// Vérifier si la file est vide
int isQueueEmpty(CircularQueue *queue) {
return queue->size == 0;
}
}
// Libérer la mémoire de la file
void freeQueue(CircularQueue *queue) {
free(queue->data);
queue->data = NULL;
queue->capacity = queue->head = queue->tail = queue->size = 0;
}
// Programme principal
int main() {
CircularQueue queue;
initializeQueue(&
in
queue, 5); // Capacité de la file : 5
// Ajout d'éléments dans la file
enqueue(&queue, 10);
enqueue(&queue, 20);
enqueue(&
enqueu
queue, 30);
enqueue(&queue, 40);
enqueue(&queue, 50);
if (enqueue(&queue, 60) == -1) {
printf("La file est pleine !\n");
}
}
// Retirer des éléments de la file
int value;
while (!isQueueEmpty(&queue)) {
dequeue(&queue, &value);
printf("Élément retiré : %d\n", value);
}
if (dequeue(&queue, &value) == -1) {
printf("La file est vide !\n");
}
// Libérer la mémoire
freeQueue(&
freeQueue(&queu
queue);
return 0;
}
tail
.tail
de manière circulaire.head
.head
de manière circulaire.head
et tail
bouclent grâce à l’opération modulo ( %
).void *
).En suivant ce guide, vous pouvez facilement implémenter et utiliser un fichier en tableau circulaire pour diverses applications en C, comme la gestion de flux de données ou les tâches FIFO.
L’exercice de la contraction de texte, souvent redouté des élèves, vise précisément cet objectif :…
La Révolution française, déclenchée en 1789, constitue l’un des tournants majeurs de l’histoire moderne. En…
L’histoire s’écrit à partir de documents : textes, images, objets ou témoignages. Ces sources, qu’elles…
La prise de notes est une compétence essentielle dans tout apprentissage. Que ce soit en…
L’argumentation occupe une place centrale dans le raisonnement juridique. Elle ne consiste pas à exprimer…
Charles Baudelaire, poète majeur du XIXe siècle, publie en 1857 Les Fleurs du mal, recueil…
This website uses cookies.