Bonjour,

J'ai un soucis concernant l'ajout de noeud dans mon arbre.
Lorsqu'il s'agit du 1er ou du 2ème noeud çava mais après sa fait n'importe quoi. Est-ce que vous pouvez m'indiquez ce qui ne va pas svp ?

Un noeud contient un id, un objet, un shape et une liste de noeud fils (pour les objet et shape c'est pas important).

SI vous trouvez des choses qui ne vont pas au niveau des structures n'hésitez pas (il y a surement beaucoup de choses qui ne vont pas ).

Tree.hpp

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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
/* tree.h */
 
#ifndef H_TREE
#define H_TREE
 
typedef enum {
	STANDARD,
	INDEXED
} MeshType;
 
typedef struct item {
	struct node *node;
    struct item *next;
} Item;
 
typedef Item *pList;
 
typedef struct object {
    char *name;
} Object;
 
typedef Object *pObject;
 
typedef struct shape {
    char *name;
	MeshType meshType;
	void *data;
} Shape;
 
typedef Shape *pShape;
 
typedef enum {
	OBJECT,
	SHAPE
} NodeType;
 
typedef struct node {
	int id;
	NodeType type;
	pObject object;
    pShape shape;
    pList childs;
} Node;
 
typedef Node *pNode;
 
typedef struct tree {
	pNode root;
	int size;
} Tree;
 
pList createEmptyList();
pList addItem(pList list, pNode node);
 
pObject createObject(char *name);
pShape createShape(char *name, MeshType meshType, void *data);
pNode createNode(int id, NodeType type, pObject object, pShape shape);
Tree createEmptyTree();
Tree addNode(Tree tree, int id, pNode node);
void displayTree(Tree tree);
 
#endif
Tree.cpp

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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
/* tree.c */
 
#include <stdio.h>
#include <stdlib.h>
 
#include "tree.hpp"
 
void error(char *s) {
	fprintf(stderr, "%s\n", s);
	exit(EXIT_FAILURE);
}
 
pList createEmptyList() {
	return (pList) NULL;
}
 
pList addItem(pList list, pNode node) {
	Item *newItem = (Item *) malloc(sizeof(Item));
 
	newItem->node = node;
	newItem->next = list;
 
	return newItem;
}
 
pObject createObject(char *name) {
	pObject object = (Object *) malloc(sizeof(Object));
 
	object->name = name;
 
	return object;
}
 
pShape createShape(char *name, MeshType meshType, void *data) {
	pShape shape = (Shape *) malloc(sizeof(Shape));
 
	shape->name = name;
	shape->meshType = meshType;
	shape->data = data;
 
	return shape;
}
 
pNode createNode(int id, NodeType type, pObject object, pShape shape) {
	pNode node = (Node *) malloc(sizeof(Node));
 
	node->id = id;
	node->type = type;
 
	if (type == OBJECT) {
		node->object = object;
		node->shape = NULL;
		node->childs = createEmptyList();
	} else {
		node->object = NULL;
		node->shape = shape;
		node->childs = createEmptyList();
	}
 
	return node;
}
 
Tree createEmptyTree() {
	Tree tree;
 
	tree.root = (pNode) NULL;
	tree.size = 0;
 
	return tree;
}
 
Tree addNode(Tree tree, int id, pNode node) {
	if (node == NULL) {
		error((char *) "error : invalid node");
	}
 
	if (tree.root == NULL) {
		tree.root = node;
		tree.size++;
	} else {
		if (id < 0 || id > tree.size) {
			error((char *) "error : invalid id");
		}
 
		if (tree.root->id == id) {
			tree.root->childs = addItem(tree.root->childs, node);
			tree.size++;
 
			return tree;
		} else {
			pList copy = tree.root->childs;
 
			while (copy != NULL) {
				Tree subTree;
 
				subTree.root = copy->node;
				subTree.size = tree.size;
 
				addNode(subTree, id, node);
 
				copy = copy->next;
			}
		}
	}
 
	return tree;
}
 
void displayTree(Tree tree) {
	printf("node id : %d  -  name : %s\n", tree.root->id, tree.root->object->name);
 
	pList copy = tree.root->childs;
 
	while (copy != NULL) {
		Tree subTree;
 
		subTree.root = copy->node;
		subTree.size = tree.size;
 
		displayTree(subTree);
 
		copy = copy->next;
	}
}
Code pour tester:
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
17
18
19
20
21
22
23
24
25
26
 
	tree = createEmptyTree();
 
	node = createNode(tree.size + 1, OBJECT, createObject((char *) "scene"), NULL);
	tree = addNode(tree, 0, node);
	displayTree(tree);
 
	node = createNode(tree.size + 1, OBJECT, createObject((char *) "table"), NULL);
	tree = addNode(tree, 1, node);
	displayTree(tree);
 
	node = createNode(tree.size + 1, OBJECT, createObject((char *) "pied"), NULL);
	tree = addNode(tree, 2, node);
	displayTree(tree);
 
	node = createNode(tree.size + 1, OBJECT, createObject((char *) "pied"), NULL);
	tree = addNode(tree, 3, node);
	displayTree(tree);
 
	node = createNode(tree.size + 1, OBJECT, createObject((char *) "pied"), NULL);
	tree = addNode(tree, 2, node);
	displayTree(tree);
 
	node = createNode(tree.size + 1, OBJECT, createObject((char *) "pied"), NULL);
	tree = addNode(tree, 1, node);
	displayTree(tree);