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
|
arbre* Ajouter(int val, arbre* in)
{
/* nous aurons besoin d'un noeud temporaire, que l'on initialise à NULL */
arbre *travail=NULL;
/* le test du cas de base: ici, c'est le fait que le noeud passé en
parametre vaut NULL*/
if(in==NULL)
{
/* pour le débuggage */
printf("tentative d'allocation pour le noeud %d",val);
/* nous sommes sur une feuille de l'arbre, il faut effectuer
l'allocation dynamique */
/* nous avons un pointeur de travail, profitons-en ;) */
travail=malloc(sizeof(arbre));
/* qui dit allocation dynamique, dit vérification qu'elle s'est bien
déroulée */
if(travail!=NULL)
{
/* pour le débuggage */
printf("... ok, on initialise\n");
/* si c'est le cas, on l'initialise correctement */
travail->valeur=val;
travail->gauche=NULL;
travail->droite=NULL;
}
/* pour le débuggage */
else
{
printf("...NOT ok :'(\n",val);
}
}
else
{
/* si on n'est pas dans le cas de base, il faut choisir si on veut
aller à gauche ou à droite */
if(in->valeur < val)
{
/* j'ai dit que l'idéal était de renvoyer le dernier élément
alloué on récupère donc l'appel récursif sur notre
pointeur de travail*/
travail= Ajouter(val,in->gauche);
/* Mais peut etre que le noeud fraichement alloué doit venir
juste apres celui sur lequel on se trouve... */
if(in->gauche==NULL)
in->gauche=travail;
}
/* Si c'est pas à gauche, c'est peut etre à droite :P */
if(in->valeur > val)
{
travail=Ajouter(val, in->droite);
if(in->droite==NULL)
in->droite=travail;
}
}
/* on renvoie le résultat à la fonction appelante */
return travai;
} |
Partager