Tableau de pointeur sur Arbre
Fermé
Nicow
-
Modifié par Nicow le 28/12/2012 à 19:40
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 5 janv. 2013 à 13:44
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 5 janv. 2013 à 13:44
A voir également:
- Tableau de pointeur sur Arbre
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Le fichier contient une liste de prénoms. triez ce tableau par ordre alphabétique des prénoms. quel mot est formé par les 6 premières lettres de la colonne code ? - Forum Bureautique
- Afficher un tableau en c - Forum C
- Faire son arbre généalogique gratuit sans inscription ✓ - Forum Loisirs / Divertissements
1 réponse
mamiemando
Messages postés
32283
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 mars 2023
7 572
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