Exemple :
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct boite /*je crée ma structure boite*/
{
float val; /*qui comprend un flottant*/
struct boite* pp; /*et pp est une adresse d'une boite* */
struct boite* pg; /*idem*/
}
boite; /* je nomme ma structure*/
typedef boite* pointeur; /* le type "pointeur" est équivalent à "boite*" */
pointeur creation (void) /* ma fonction de saisie*/
{
pointeur racine=NULL; /*déclaration racine, de type pointeur, qui est initialisé à NULL*/
pointeur actu,nouv; /*déclaration actu et nouv de type pointeur*/
float x; /*déclaration du flottant x */
do
{
printf ("valeur (<0 pour finir)?");
scanf ("%f",&x);
if (x>=0) /*on vérifie que la valeur est prenable*/
{ /* NULL correspond a l'adresse 0*/
nouv=malloc(sizeof(boite)); /*alors on réserve de la place pour une boite et je mets l'adresse dans nouv*/
nouv->val=x; /*dans le champ val pointé par nouv, je place la valeur de x cad une valeur de type flottant*/
nouv->pp=NULL; /* pp(c'est une adresse) de nouv vaut NULL(=adresse 0)*/
nouv->pg=NULL; /* idem pour pg*/
if (racine==NULL) racine=nouv; /* ceci ne sera fait que pour la première boite créée, puisqu'après il n'est plus NULL*/
else
{
actu=racine;
do
{
if (x<actu->val) /*s'il est plus petit je vais le mettre dans la case pp */
if (actu->pp==NULL) /* si la case pp est disponible, je l'y mets */
{
actu->pp=nouv;
nouv=NULL; /* c'est juste pour dire que "ca y est, on l'a casé" */
}
else actu=actu->pp; /* si pp est déjà occupé j'essaie le suivant */
else /*donc x>=actu->val : idem pour pg au lieu de pp */
if (actu->pg==NULL)
{
actu->pg=nouv;
nouv=NULL;
}
else actu=actu->pg;
}
while (nouv!=NULL); /* tant que je ne l'ai pas "casé" */
} /* accolade de fin du "else" */
} /* fin du "if(x>=0)" */
} /* fin du "do" donc doit être suivi par un "while" */
while (x>=0);
return (racine);
} /* fin de la fonction creation */
void affiche(pointeur p)
/* version qui les affiche dans l'ordre (récursif) */
{
if (p->pp!=NULL) affiche (p->pp);
printf ("%f ",p->val); /* il y a un espace pour éviter qu'il colle les nombres les uns a la suite des autres*/
if (p->pg!=NULL) affiche (p->pg);
}
float somme(pointeur p)
{
float s;
s=p->val;
if (p->pp!=NULL) s+=somme(p->pp);
if (p->pg!=NULL) s+=somme(p->pg);
return (s);
}
void main(void)
{
pointeur racine;
racine=creation();
affiche (racine);
printf("%f",somme (racine));
}
Patrick TRAU,ULP - IPST 12/12/97