Tableau de pointeur sur Arbre

Fermé
Nicow - Modifié par Nicow le 28/12/2012 à 19:40
mamiemando Messages postés 33108 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 14 mai 2024 - 5 janv. 2013 à 13:44
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 :

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 . ^^
            
                

1 réponse

mamiemando Messages postés 33108 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 14 mai 2024 7 753
Modifié par mamiemando le 5/01/2013 à 13:47
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 :

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
0