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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
#include<stdio.h>
#include <stdlib.h>
//#include <conio.h>
/*type liste*/
struct noeud {
int val;
struct noeud *g;
struct noeud *d;
};
typedef struct noeud *ab;
/*creation dun neoud*/
ab creat(int v, ab ls, ab rs)
{
ab res;
// malloc renvoie un pointeur sur un espace mémoire
// dont la taille est fournie en paramètre.
// Tu veux créer de la place pour un noeud et malloc
// renvoie un pointeur sur cet espace.
// C'est à priori le seul endroit où tu vas utiliser
// struct noeud
res = (ab) malloc(sizeof(struct noeud));
if (res == NULL) {
fprintf(stderr, "Impossible d'allouer le noeud");
return NULL;
}
res->val = v;
res->g = ls;
res->d = rs;
return res;
}
/*ajout dun element dans un ab*/
// Avec cette version toutes les modifications
// que tu vas faire sur r seront perdues au
// retour de la fonction
// si tu as :
// r=NULL;
// ajout_old(r, 1);
// ici r sera toujours NULL
// pour modifier la valeur de r il faut réecrire
// la fonction avec pour paramètre un pointeur
// sur r, donc de type ab*
// Comme tu fais pour scanf par exemple
void ajout_old(ab r, int elt)
{
if (r == NULL) {
r = creat(elt, NULL, NULL);
} else if (r->g == NULL) {
r->g = creat(elt, NULL, NULL);
} else if (r->d == NULL) {
r->d = creat(elt, NULL, NULL);
} else {
ajout_old(r->g, elt);
}
}
// ici pr est un pointeur sur un ab
// si le pointeur est NULL il doit y avoir une
// erreur
// si le pointeur pointe sur NULL = arbre vide
// j'ai sur parenthésé pour que tu vois
// ce qui est manipulé
void ajout(ab* pr, int elt)
{
if (pr==NULL) {
printf("Erreur.");
exit(1);
} else if ((*pr)==NULL)
*pr=creat(elt,NULL,NULL);
else if ((*pr)->g==NULL)
(*pr)->g=creat(elt,NULL,NULL);
else if ((*pr)->d==NULL)
(*pr)->d=creat(elt,NULL,NULL);
else
// remarque que je passe l'adresse du
// fils gauche
ajout( &((*pr)->g), elt);
}
/*affichage dun ab*/
void parcourirArbre(ab n)
{
if (n != NULL) {
parcourirArbre(n->g);
printf("%d ", n->val);
parcourirArbre(n->d);
}
}
/*programme principal*/
main()
{
int choix, cho, x;
ab a = NULL;
do {
/*faire le choix */
printf("\n");
printf("1)- Creation d'un arbre binaire.");
printf("\n");
printf("2)- Affichage d'un arbre binaire.");
printf("\n");
printf("\n");
printf("ENTRER VOTRE CHOIX : ");
scanf("%d", &choix);
printf("\n");
/*travailler le choix */
switch (choix) {
case 1:{
cho = 1;
while (cho != 0) {
printf
("Entrer la valeur pour l'inserer dans l'arbre:\n");
scanf("%d", &x);
ajout(&a, x);
printf
("Voulez vous ajoutez un element? (1 / 0)\n");
scanf("%d", &cho);
}
printf("\n");
break;
}
case 2:{
printf("**AFFICHAGE DE LA LISTE**\n");
parcourirArbre(a);
break;
}
}
} while (choix != 0);
// getch();
}
~ |