1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <stdlib.h>
#include <assert.h>
/*En supposant qu'un nud est de type object_link*/
typedef struct object_link
{
struct object_link *pNext;
object* data;
};
/*D'abord quelques fonctions d'aide, qui évitent les erreurs:*/
/*Fonction de free fortement typée*/
void free_node(object_link *pRemove) { free(pRemove); }
/*Fonction pour parcours indirect de la liste:
À partir d'un pointeur sur un pointeur sur un objet, elle retourne le pointeur sur son pointeur "suivant",
c'est-à-dire le pointeur sur le pointeur sur l'objet suivant.*/
object_link ** GetNextPtr(object_link ** ppObj)
{
/*La fonction ne doit pas être appelée sur un pointeur nul, ni sur un pointeur pointant sur un pointeur nul.*/
/*Elle ne retourne jamais un pointeur nul non plus, mais elle peut retourner un pointeur sur un pointeur nul.*/
assert(ppObj != NULL);
assert(*ppObj != NULL);
return &( (*ppObj)->pNext );
}
/*Retourne le pointeur sur le pointeur sur le premier objet contenant O.
Le pointeur retourné pointe donc sur celui à modifier si on supprime le nud.
Cette fonction retourne un pointeur nul en cas d'échec,
mais ne retourne jamais de pointeur sur un pointeur nul.*/
object_link ** List_FindPtr(object_link ** ppHead, object * O)
{
object_link **ppCurrent;
assert(ppHead != NULL);
for(ppCurrent=ppHead ; *ppCurrent != NULL ; ppCurrent = GetNextPtr(ppCurrent))
{
if((*ppCurrent)->data == 0)
return ppCurrent;
}
return NULL;
}
void List_Remove(object_link ** ppHead, object * O)
{
object_link ** ppRemove = List_FindPtr(ppHead, O);
if(ppRemove != NULL)
{
object_link *pRemove = *ppRemove;
*ppRemove = pRemove->pNext;
free_node(pRemove);
}
} |
Partager