Tableau de pointeur sur Arbre
Fermé
Nicow
-
Modifié par Nicow le 28/12/2012 à 19:40
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 5 janv. 2013 à 13:44
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 5 janv. 2013 à 13:44
A voir également:
- Tableau de pointeur sur Arbre
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Imprimer tableau excel sur une page - Guide
1 réponse
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié par mamiemando le 5/01/2013 à 13:47
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 :
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