Page principale   Modules   Liste des composants   Liste des fichiers   Composants   Déclarations  

Interface de gestion de listes
[Implémentation de FRED]

Ce module est une gestion de liste FIFO. Plus de détails...

Composants

struct  FredCell
 descripteur de cellule de liste Plus de détails...

struct  FredList
 descripteur de liste Plus de détails...


Définitions des macros

#define NIL   ((FredCell*)0)
 macro pour définir le pointeur vide

#define FredCELL   FredCell _cell
 macro pour définir une structure comme une cellule de liste

#define FredListEmpty(Q)   (((Q)->last) == (FredCell*)0)
 Test de file vide.


Définitions des types

typedef FredCell FredCell
 descripteur de cellule de liste

typedef FredList FredList
 descripteur de liste


Fonctions

void FredListPutLast (FredList *q, FredCell *b)
 Insertion en queue d'une cellule.

FredCellFredListGetFirst (FredList *q)
 Retrait de la cellule de tête.

void FredListInit (FredList *q)
 Initialisation de la liste.


Description détaillée

Elle est implantée comme une liste circulaire doublement chaînée avec insertion en queue et retrait en tête.

Documentation de la macro

#define FredCELL   FredCell _cell
 

Pour définir une structure qyelconque comme pouvant être insérer dans une liste, il suffit d'insérer FredCELL en premiere définition des composants de la structure

struct MyCell{ 
  FredCELL;
  int x;
  int y;
  ...
};

#define FredListEmpty      (((Q)->last) == (FredCell*)0)
 

#define NIL   ((FredCell*)0)
 


Documentation du type

typedef struct FredCell FredCell
 

Dans une liste circulaire à 1 élément, celui ci est son propre successeur et prédécesseur. Il est donc doublement rechainé sur lui-même.

typedef struct FredList FredList
 

Une liste circulaire pointe sur le dernier élément. Pour une liste vide, ce derrnier élément est nul.


Documentation de la fonction

FredCell* FredListGetFirst FredList   q
 

Paramètres:
q  liste où retirer
Renvoie :
cellule retirer

Implantation
Le retrait en tête nécessite de traiter le cas d'une file vide et le cas d'une file à 1 élément. Le cas d'une file à 2 cellules qui devient à 1 cellule(qui est chainée sur elle même) peut se traiter comme le cas général.

00048 {
00049   FredCell* b;
00050   if(FredListEmpty(q)){ 
00051     /* file vide */
00052     return NIL;
00053   }else if ( q->last->next==q->last){
00054     /* file à 1 item */
00055     b=q->last; 
00056     q->last=NIL; /* la file devient vide */
00057   }else {
00058     b=q->last->next;
00059     b->pred->next=b->next;
00060     b->next->pred=b->pred;
00061   }
00062   b->next=b->pred=NIL; /* la cellule n'est plus chainée */
00063   return b;
00064 }

void FredListInit FredList   q
 

Paramètres:
q  liste à initialiser


Implantation

00079 { 
00080   q->last=NIL;
00081 }

void FredListPutLast FredList   q,
FredCell   b
 

Paramètres:
q  liste où insérer
b  cellule à insérer


Implantation

L'insertion en queue place la nouvelle cellule entre le dernier et le premier. Elle devient le nouveau dernier item. Deux cas particuliers sont la file vide et la file à une cellule (qui est chainée sur elle même). Ce dernier cas peut se programmer comme le cas général.

00019 {
00020   if(FredListEmpty(q)){ 
00021     /* file vide */
00022     b->next=b->pred=b;
00023     q->last=b;
00024   }else{
00025     b->next=q->last->next;
00026     b->pred=q->last;
00027     b->next->pred=b;
00028     b->pred->next=b;
00029     q->last=b;
00030   }
00031 }


Généré le Mon Jan 5 16:22:06 2004 par doxygen1.2.17