69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdlib.h>
 | |
| #include "queue.h"
 | |
| 
 | |
| struct s_link {
 | |
|   unsigned value;
 | |
|   struct s_link *next;
 | |
| };
 | |
| 
 | |
| typedef struct s_link link;
 | |
| 
 | |
| struct s_queue {
 | |
|   link *first; /* sortie */
 | |
|   link *last;  /* entrée */
 | |
| };
 | |
| 
 | |
| 
 | |
| /* crée une file vide */
 | |
| queue create_queue(void) {
 | |
|   return (queue) calloc(1, sizeof(struct s_queue));
 | |
| }
 | |
| 
 | |
| /* ajoute un élément à la file. Renvoie 0 en cas d'échec */
 | |
| int enqueue(queue the_queue, unsigned the_value) {
 | |
|   link *new = (link*) malloc(sizeof(link));
 | |
|   if (new == NULL) {
 | |
|     return 0;
 | |
|   }
 | |
|   new->value = the_value;
 | |
|   new->next = NULL;
 | |
|   if (the_queue->last == NULL) {
 | |
|     the_queue->first = new;
 | |
|   } else {
 | |
|     the_queue->last->next = new;
 | |
|   }
 | |
|   the_queue->last = new;
 | |
|   return 1;
 | |
| }
 | |
| 
 | |
| /* renvoie 1 si la file est vide */
 | |
| int empty(queue the_queue) {
 | |
|   return the_queue->first == NULL;
 | |
| }
 | |
| 
 | |
| /* retire un élément de la file. Renvoie l'élément retiré, ou -1 en cas d'échec */
 | |
| long dequeue(queue the_queue) {
 | |
|   if(the_queue->first == NULL) {
 | |
|     return -1;
 | |
|   }
 | |
|   link l = *(the_queue->first);
 | |
|   free(the_queue->first);
 | |
|   the_queue->first = l.next;
 | |
|   if (the_queue->first == NULL) {
 | |
|     the_queue->last = NULL;
 | |
|   }
 | |
|   return l.value;
 | |
| }
 | |
| 
 | |
| /* détruit une file en libérant les ressources associées */
 | |
| void destroy_queue(queue the_queue) {
 | |
|   link *current, *saved;
 | |
| 
 | |
|   current = the_queue->first;
 | |
|   while(current != NULL) {
 | |
|     saved = current->next;
 | |
|     free(current);
 | |
|     current = saved;
 | |
|   }
 | |
|   free(the_queue);
 | |
| } |