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
| PGENRE_NEW * GetPtrAfterLastGenre(PGENRE_NEW *ppFirst)
{
PGENRE_NEW *ppCurrent;
for(ppCurrent=ppFirst ; (*ppCurrent)!=NULL ; ppCurrent = GetPtrNext(pCurrent))
{ }
//Ici, ppCurrent pointe sur un pointeur nul.
return ppCurrent;
}
void Insert(PGENRE_NEW *ppWhere, PGENRE_NEW pNew)
{
pNew->pNext = *ppWhere;
*ppWhere = pNew;
}
void InsertHead(PGENRE_NEW pNew)
{
Insert(&pRootGenre, pNew);
}
void AppendTail(PGENRE_NEW pNew)
{
Insert(GetPtrAfterLastGenre(&pRootGenre), pNew);
}
//Exemple qui ajoute chaque élément à la fin, en boucle,
//de manière efficace (on ne re-parcoure pas toute la liste à chaque fois)
void BuildList()
{
PGENRE_NEW pNew = NULL;
PGENRE_NEW *ppAfterLast = GetPtrAfterLastGenre(&pRootGenre);
//Ici, ReadGenre() est ta fonction qui crée un nouveau genre depuis un fichier,
//une entrée utilisateur, etc. On suppose qu'elle retourne NULL quand il n'y a plus rien à mettre dans la liste.
while((pNew=ReadGenre()) != NULL)
{
Insert(ppAfterLast, pNew);
ppAfterLast = GetPtrNext(ppAfterLast);
}
} |
Partager