Tableau de pointeur sur Arbre
Bonjours tout le monde ,
je vous expose mon problème , voila je suis en train d'essayer de crée un puissance 4 avec une intelligence artificiel intégrée. // Assez complexe a faire je trouve :s
Je suis en train de crée une fonction qui crée l'arbre et le rempli en même temps avec une fonction qui évalue une grille passée en paramétré et retourne la valeur de l'évaluation.
J'ai bien avancer mais je bloque sur un problème j'ai un arbre avec la structure suivant :
Bref j'alloue mon arbre
Pas de soucis mais je voudrais aussi crée enfin alloué le tableau de pointeur sur les arbres .
Ainsi j'ai cette erreur.
Je voudrais donc savoir si , d'une j'ai bien alloué mon tableau et 2 pourquoi je n'arrive pas a y accedé et je tombe sur cette erreur car ma fonction retourne en arbre [ un noeud de l'arbre a vrai dire ]
Je ne sais pas trop comment m'en sortir c'est pourquoi je fais appel a votre aide , en espérant avoir été assez clair sur mon problème.
Merci a ceux qui m'aideront . ^^
je vous expose mon problème , voila je suis en train d'essayer de crée un puissance 4 avec une intelligence artificiel intégrée. // Assez complexe a faire je trouve :s
Je suis en train de crée une fonction qui crée l'arbre et le rempli en même temps avec une fonction qui évalue une grille passée en paramétré et retourne la valeur de l'évaluation.
J'ai bien avancer mais je bloque sur un problème j'ai un arbre avec la structure suivant :
typedef struct st_arbre { int valeur; int colonne; struct st_arbre**tableau; // tableau de pointeur sur les noeuds suivants }noeud;
Bref j'alloue mon arbre
arbre noeud = (arbre) malloc(1*sizeof(noeud));
Pas de soucis mais je voudrais aussi crée enfin alloué le tableau de pointeur sur les arbres .
int nb_colonne_libre = 0,col=0; for (colonne = 0; colonne < NB_COLONNE ; colonne ++) if(!(colonne_pleine(grille,colonne))) // on cherche a compter que les colonnes pas pleines nb_colonne_libre ++; // je compte combien d'arbre on une colonne ou l'on peut insérer un pion // On alloue le tableau des fils noeud->tableau = calloc(nb_colonne_libre,sizeof(noeud)); // Ici je voudrias alloué mon tableau qui contiendra les pointeur versles arbres suivant for (colonne = 0; colonne < NB_COLONNE ; colonne ++) { if(!(colonne_pleine(grille_copy,colonne))) { noeud->tableau[col] = remplire_arbre(grille_copy,joueur,profondeur--,colonne); // Suite de mon code ...
Ainsi j'ai cette erreur.
arbre_new.c: In function 'remplire_arbre': arbre_new.c:68:28: attention : assignment from incompatible pointer type [enabled by default] /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function '_start': (.text+0x18): undefined reference to 'main' collect2: ld a retourné 1 code d'état d'exécution
Je voudrais donc savoir si , d'une j'ai bien alloué mon tableau et 2 pourquoi je n'arrive pas a y accedé et je tombe sur cette erreur car ma fonction retourne en arbre [ un noeud de l'arbre a vrai dire ]
Je ne sais pas trop comment m'en sortir c'est pourquoi je fais appel a votre aide , en espérant avoir été assez clair sur mon problème.
Merci a ceux qui m'aideront . ^^
A voir également:
- Tableau de pointeur sur Arbre
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Imprimer tableau excel sur une page - Guide
- Tableau croisé dynamique - Guide
1 réponse
Pour moi ta structure de noeud n'est pas cohérente. Dans un arbre un noeud (type que je vais appeler node_t) encapsule une donnée (que je vais appeler data) et des fils (que je vais appeler children). Si on ne sait pas combien de fils sont présents dans le noeud il faut également stocker cette valeur (que je vais appeler num_children).
La partie children est un tableau de pointeur sur des noeuds (donc un tableau de node_t **). Ainsi un arbre se définit comme suit :
Par convention on va supposer qu'un pointeur NULL signifie qu'il n'y a pas de donnée (et que si un pointeur est non nul, il y a quelque chose au bout).
Je ne vais pas détailler tout le code, mais si je résume ton problème, tu n'arrives pas à allouer le champs children au moment de créer un noeud. Donc voici comment tu peux faire :
Une fois tes noeuds créés il suffit de les mailler entre eux :
Bonne chance
La partie children est un tableau de pointeur sur des noeuds (donc un tableau de node_t **). Ainsi un arbre se définit comme suit :
typedef struct _node_t { void *data; struct _node_t ** children; unsigned num_children; } node_t; typedef struct _tree_t { node_t * root; } tree_t;
Par convention on va supposer qu'un pointeur NULL signifie qu'il n'y a pas de donnée (et que si un pointeur est non nul, il y a quelque chose au bout).
Je ne vais pas détailler tout le code, mais si je résume ton problème, tu n'arrives pas à allouer le champs children au moment de créer un noeud. Donc voici comment tu peux faire :
node_t * new_node(unsigned num_children) { node_t * node = calloc(sizeof(node_t)); node->children = calloc(num_children, sizeof(node_t *)); node->num_children = num_children; } void free_node(node_t *node) { unsigned i; if (node) { if (node->children) { for(i = 0; i < node->num_children; ++i) free_node(node->children[i]); free(node->children); } free(node); } }
Une fois tes noeuds créés il suffit de les mailler entre eux :
tree_t tree; node_t * root = new_node(2); node_t * node1 = new_node(0); node_t * node2 = new_node(0); tree->root = root; tree->root->children[0] = node1; tree->root->children[1] = node2; free_node(root);
Bonne chance