Bonjour,
dans le cadre d'un projet assez long, je me retrouve à devoir utiliser des arbres afin de réaliser une IA. J'aimerais construire l'arbre et le remplir dans une même fonction récursive. J'ai simplifié les algorithmes afin d'avoir quelque chose de lisible.
Je souhaite avoir un arbre comprenant n fils, et chaque fils comprennent eux mêmes n fils, etc... Ce nombre n est calculé avant chaque boucle for mais pour cet exemple je lui fixe directement une valeur.
Voici les structures pour l'arbre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 struct s_noeud { int score; struct s_noeud **fils; char deplacement[6]; }; struct s_arbre { struct s_noeud *racine; }; typedef struct s_noeud Noeud; typedef struct s_arbre Arbre;
J'ai fais un algorithme afin de créer et remplir tous les n fils de la racine, qui fonctionne et donne ceci :
Je souhaite donc désormais adapter cet algorithme afin qu'il soit récursif, et qu'il fonctionne pour tous les sous-fils, sous-sous fils, etc jusqu'à une profondeur voulu.Voici ce que j'ai tenté :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Arbre *ajouterTousLesFils (Arbre *monArbre, int nbCoups) { srand(time(NULL)); Noeud *monNoeud = monArbre->racine; monNoeud = malloc(sizeof(Noeud)); monNoeud->fils = malloc(sizeof(Noeud *) * nbCoups); for (int i = 0; i < nbCoups; i++) { monNoeud->fils[i] = malloc(sizeof(Noeud)); monNoeud->fils[i]->score = rand() % 42; } monArbre->racine = monNoeud; return monArbre; }
L'appel dans le main n'a rien de particulier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Noeud *construitEtRemplit (Noeud *monNoeud, int hauteur, int nbCoups) { srand(time(NULL)); monNoeud = malloc(sizeof(Noeud)); if (!hauteur) { monNoeud->score = rand() % 42; } else { monNoeud->fils = malloc(sizeof(Noeud *) * nbCoups); for (int i = 0; i < nbCoups; i++) { monNoeud->fils[i] = malloc(sizeof(Noeud)); monNoeud = construitEtRemplit(monNoeud->fils[i], hauteur-1, 2); } } return monNoeud; }
J'ai un problème de segmentation au niveau de l'algorithme récursif, dans la boucle for. J'ai un peu de mal avec les malloc et la récursion, par exemple doit-on caster les malloc ? Je vois à des endroits que oui, à d'autres que non, ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Arbre *unArbre = creerArbre(); Noeud *noeud = racine(unArbre); noeud = construitEtRemplit(noeud, 2, 2);
Voilà j'espère que vous pourrez m'aider,
bonne soirée,
Nestarym.
Partager