par Jean-Luc Mounier
Laboratoire d'Informatique de Paris 6
SOMMAIRE
|
Le module |
IntroductionLe module Pour utiliser les CListes inclure le fichier CListes.h précédé de Types.h pour la définition du type Boolean (ou FkBoolean si FRAME_KIT est défini). (à revoir). |
Types |
CListeCListe est un pointeur sur une tête de liste créée par CreerListe. |
P_ListElemP_ListElem est un pointeur sur une structure interne du gestionnaire de liste correspondant à un élément ajouté dans une liste. |
ParcoursProcPtrParcoursProcPtr est un pointeur sur une fonction appelée lors des parcours de listes.
|
LiDataTypeLiDataType indique si la donnée est de type pointeur ou handle (pointeur de pointeur).
|
Fonctions de création, destruction |
|
#include <CListes.h> CListe CreerListe(void); |
Pointeur vers la structure de donnée décrivant une liste. NULL si on ne peut pas allouer de la mémoire.
Attention:
|
|
#include <CListes.h> void ViderListe(CListe cListe); |
cListe |
la liste à vider. |
pas de résultat.
Attention:
|
|
#include <CListes.h> void DetruireListe(CListe cListe); |
cListe |
la liste à détruire. |
pas de résultat.
Attention:
|
Fonctions d'ajout, suppression |
|
#include <CListes.h> |
cListe |
la liste. |
pData |
Le pointeur sur la donnée à ajouter dans la liste. |
Pointeur sur un élément de liste (structure de donnée interne au gestionnaire de liste).
Attention:
|
|
#include <CListes.h> |
cListe |
la liste. |
pData |
Le pointeur sur la donnée à ajouter dans la liste. |
Pointeur sur un élément de liste (structure de donnée interne au gestionnaire de liste).
Attention:
|
|
#include <CListes.h> |
rend kFk_True si l'élément a été ajouté à la liste.
voir AjoutListe.
Attention:
|
|
#include <CListes.h> |
rend kFk_True si l'élément a été ajouté à la liste.
voir AjoutListe.
Attention:
|
|
#include <CListes.h> |
cListe |
la liste. |
pData |
Le pointeur sur la donnée à enlever de la liste. |
Aucun.
Attention:
|
|
#include <CListes.h> |
cListe |
la liste. |
pData |
Le pointeur sur la donnée à enlever de la liste. |
rend kFk_True si l'élément a été enlevé de à la liste.
Attention:
|
Fonctions diverses |
|
#include <CListes.h> |
cListe |
la liste. |
pData |
Le pointeur sur la donnée recherchée. |
Pointeur sur un élément de liste (structure de donnée interne au gestionnaire de liste) ou NULL si l'élément n'est pas trouvé.
Pas de test d'erreur.
|
#include <CListes.h> |
cListe |
la liste. |
Pointeur la première donnée disponible dans la liste ou NULL la liste est vide.
Attention:
|
|
#include <CListes.h> |
cListe |
la liste. |
Pointeur la dernière donnée disponible dans la liste ou NULL la liste est vide.
Attention:
|
|
#include <CListes.h> |
cListe |
la liste. |
rend kFk_True si il n'y a qu'un seul élément dans la liste.
Attention:
|
|
#include <CListes.h> |
cListe |
la liste. |
le nombre d'élement de la liste.
Attention:
|
Fonctions de parcours |
|
#include <CListes.h> void ParcoursListe(CListe cListe,ParcoursProcPtr Action,...); |
cListe |
la liste à parcourir. |
Action |
Fonction à appeler pour chaque élément |
... |
Jusqu'à 8 paramètre de type pointeurs |
Attention:
|
Il faut noter qu'il est possible de supprimer des éléments et d'en ajouter à une liste pendant le parcours de cette même liste.
Voir Exemple d'utilisation en Annexe 1.
|
#include <CListes.h> void ParcoursInverse(CListe cListe,ParcoursProcPtr Action,...); |
cListe |
la liste à parcourir. |
Action |
Fonction à appeler pour chaque élément |
... |
Jusqu'à 8 paramètre de type pointeurs |
|
#include <CListes.h> void ParcoursInverse(void *pData); |
pData |
Le pointeur sur la donnée à ajouter dans la liste. |
Attention:
|
la variable globale (index) n'est maintenue à la sortie de ParcoursListe, ainsi que par ListePremier et ListeDernier. Attention, la fonction ParcoursSuivant ne change pas la valeur de l'index.
|
#include <CListes.h> void *ParcoursSuivant(void); |
Attention:
|
la variable globale (index) n'est maintenue à la sortie de ParcoursListe, ainsi que par ListePremier et ListeDernier. Attention, la fonction ParcoursSuivant ne change pas la valeur de l'index.
|
#include <CListes.h> void *ParcoursPrecedent(void); |
Attention:
|
la variable globale (index) n'est maintenue à la sortie de ParcoursListe, ainsi que par ListePremier et ListeDernier. Attention, la fonction ParcoursSuivant ne change pas la valeur de l'index.
|
#include <CListes.h> void EnleveElementCourant(void); |
Attention:
|
Fonctions d'accès rapideLe principe des fonctions d'accès rapide est le suivant :
Ces procédures sont particulièrement adaptées à rechercher une donnée numérique dans une liste. |
|
#include <CListes.h> void *FindInList(CListe cListe,LiDataType isHandle |
cListe |
la liste à parcourir pour la recherche. |
isHandle |
Booléen indiquant si les pointeurs contenus dans la cListe sont des pointeurs simple ou des Handle (au sens MacOS), c'est à dire des pointeurs de pointeurs. |
pRecherche |
Pointeur sur la donnée recherchée. |
size |
Taille de la donnée recherchée. |
offset |
Distance entre le début de la structure de chaque élément de la liste et la position de la donnée recherchée. |
Attention:
|
Fonction de hachageLe principe des fonctions d'accès rapide est le suivant : On suppose que les pointeurs stockées dans la liste pointent vers des éléments de même type. Pour utiliser les listes hachées, la seule différence est la création de la liste. Il faut utiliser LiNew au lieu de CreerListe. Les autres fonctions sont identiques par contre la fonction la plus accélérée est FindInList. |
LiListTypeLiListType défini le type de liste : liste standard ou listes avec hachage sur donnée numérique de type long.
|
|
#include <CListes.h> CListe LiNew(LiListType liListType, LiDataType isHandle,size_t offset); |
Pointeur vers la structure de donnée décrivant une liste. NULL si on ne peut pas allouer de la mémoire.
Attention:
|
Annexe 1Ajout et recherche d'éléments dans une liste struct Data { short a; // first element short b; // second element } typedef struct Data Data; typedef Data *PData; static void AddElement(CListe cListe,short a,short b) { PData pData; pData=(PData)NewPtr(sizeof(Data)); // équivalent à malloc if (pData==NULL) { ERREUR("No more memory"); return; } pData->a=a; pData->b=b; AjoutListe(cListe, pData); } static void *Cherche(PData pData,short *pValue) { if (pData->b == *pValue) return(pData); return(NULL); } // main { PData pData; short value; CListe cListe; // head of liste global variable ListeInit(); // only once cListe=CreerListe(); // init AddElement(cListe, 1, 100); AddElement(cListe, 2, 123); AddElement(cListe, 3, 456); // recherche l'élément dont la deuxième composante b=123 value=123; // pour en passer l'adresse pData=ParcoursListe(cListe, (ParcoursProcPtr)Cherche, &value); // va appeler Cherche successivement avec comme pData d3 puis d2 ViderListe(cListe); Attention, les éléments ne sont pas détruits, pour les détruire, au lieu d'appeler ViderListe: soit faire un ParcoursListe en appelant EnleveElement sur chaque élément. soit faire une boucle EnleveElement(cListe ,ListePremier(cListe)); tant que ListePremier(cListe) non nul DetruireListe(cListe); // Attention cListe ne pointe plus sur une liste ! } |
Annexe 2Recherche du premier élément dont la valeur b est égale à 123. struct Data { short a; // first element short b; // second element } typedef struct Data Data; typedef Data *PData; { PData pData; short value; value=123; // pour en passer l'adresse pData = FindInList(cListe, false, &value, sizeof(short), (size_t)&pData->b - (size_t)pData); } |
API de Framekit en C | FrameKit
Mise à jour :
Version originale 03-mars-1988 puis 03-mai-1993
Mise à jour : 04-nov-1999