Nom | Type | Commentaire |
---|---|---|
contact | Contact* | Argument sous la forme de pointeur sur un type Contact représentant notre "pointeur de travail" |
id | entier | Argument contenant la valeur de l'identifiant recherché |
insere | booléen | Argument précisant si la recherche doit être effectuée dans l'optique d'une insertion ou non |
Le pseudo code correspondant à cette fonction est
Contact Cherche(travail, id, insere) { Si(travail == NULL OU travail->id == id OU (travail->Precedent->id < id ET travail->Suivant->id > id ET insere = FAUX) OU (travail->Precedent == NULL ET travail->id > id ET insere = FAUX) OU (travail->Suivant == NULL ET travail->id < id ET insere = FAUX) { Renvoie travail | } Sinon { Si(travail->id > id) { renvoie cherche(travail->Precedent, id) | } Sinon { Renvoie cherche(travail->Suivant, id) | } } }
La grosse difficulté, si l'on veut utiliser une fonction récursive, est de déterminer ce qui sera le cas de base, surtout quand plusieurs cas sont envisageables.
Dans le cas qui nous intéresse, ce sont tous les cas qui sont susceptibles de provoquer le renvoi du contact sur lequel on travaille actuellement, à savoir:
Par contre, une fois le cas de base déterminé, il devient très facile de décider dans quel sens parcourir la liste des éléments:
Si l'identifiant de l'élément sur lequel on se trouve est plus grand que l'identifiant de référence, il faut aller voir du côté de l'élément "Precedent", sinon, il faut aller voir du côté de l'élément "Suivant".
La fonction renvoie un pointeur sur l'élément de type Contact trouvé.