Page 5 / 15
II. Structure des graphes
On a décidé de créer un type graphe regroupant les graphes représentés par matrice
d’adjacence et les graphes représentés par liste de successeurs. Cela nous a permit de n’avoir
qu’une seule version de chaque algorithme à écrire.
Cela ressemble donc à de la programmation objet ou l’on aurait le type MGraph comme super
classe, et le types MGrahM et MGrahL comme classes dérivées.
Le gros problème a été de faire un type commun, tout en conservant la complexité initiale
d’accès aux graphes. On a donc crée des itérateurs propres à chaque type de graphe et qui
permettent de parcourir le graphe.
Ces itérateurs respectent la complexité d’accès aux graphes : l’itérateur des graphes
implémentés par matrice d’adjacence est en O(nombre de sommet) et l’itérateur des graphes
implémentés par liste des successeurs est en O(nombre d’arête).
typedef struct
{
void *DStruct; /* structure du graphe */
unsigned char gType; /* type du graphe */
int nbSommet; /* nombre de sommet du graphe */
/* les pointeurs de fonctions permettant le polymorphisme */
int (*GetVal)(void *Graph,int sBeg,int sEnd);
void (*StartIt)(void *Graph,ItStruct *It,int sommetDepX);
int (*NextIt)(void *Graph,ItStruct *It);
int (*AsNextIt)(void *Graph,ItStruct *It);
}MGraph;
Le void *DStruct désigne un pointeur sur la représentation du graphe. C’est donc un
pointeur, soit sur un MGraphM (implémentation par matrice), soit sur un MGraphL
(implémentation par liste). Ces différents types sont présentés dans chapitres suivants. Ce
pointeur est alloué et affecté lors de l’initialisation du graphe.
Les pointeurs void* en paramètre des fonctions StartIt, NextIt et AsNextIt devront être le
DStruct du graphe courant.
exemple d’appel de fonction :
MGraph Graph ;
ItSTruct it ;
. . .
Graph.StartIt(Graph.DStruct,&it) ;