Se connecter avec
S'enregistrer | Connectez-vous

[C++] Demande d'avis

Dernière réponse : dans Programmation

Donc voila, pour cet été j'ai décidé de me lancer dans la programmatoin C++. Pour commencer j'ai réécrit ma petite librairie pour les arbres binaires, donc voila le code et j'aurais aimé avoir votre avis, a mon avis j'ai du faire pas mal de trucs maladroit...
Voila le fichier Tree_Bin.h
  1. #ifndef __TREE_BIN_H__
  2. #define __TREE_BIN_H__
  3.  
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. class TBNode;
  9.  
  10. typedef TBNode *p_TBNode;
  11. class TBNode {
  12. public:
  13. void *element;
  14. p_TBNode left_son, right_son, father;
  15. TBNode (void *);
  16. void insert_node (p_TBNode, int (*compare_element_TB) (void *, void *, void *), void * = NULL);
  17. p_TBNode find_node (void *, int (*compare_element_TB) (void *, void *, void *), void * = NULL);
  18. p_TBNode find_successor (void);
  19. p_TBNode find_predeccessor (void);
  20. p_TBNode delete_node (p_TBNode node_to_delete);
  21. };
  22.  
  23. /*int compare_element_TB (void *element_1, void *element_2) A définir dans le programme utilisant cette librairie*/
  24. /*Il doit renvoyer -1 inferieur, 0 = et 1 superieur*/
  25.  
  26. #endif

et Tree_Bin.cpp
  1. #include "Tree_Bin.h"
  2. #include <stdlib.h>
  3.  
  4. TBNode::TBNode (void *new_element) { /*Creation d'un noeud dans l'arbre*/
  5. this->element = new_element;
  6. this->left_son = NULL;
  7. this->right_son = NULL;
  8. this->father = NULL;
  9. }
  10.  
  11. /*Insertion d'un noeud dans l'arbre, la derniere option est facultative, utilisée pour la fonction de comparaison*/
  12. /*La méthode renvoie la nouvelle racine de l'arbre*/
  13. void TBNode::insert_node (p_TBNode new_node, int (*compare_element_TB) (void *, void *, void *), void *option) {
  14. p_TBNode current_node = this; /*Noeud courant*/
  15. p_TBNode father_node = NULL; /*Père du noeud courant*/
  16. while (current_node != NULL) { /*Tant que je ne suis pas sur un emplacement non vide, je descend dans l'arbre*/
  17. father_node = current_node;
  18. if ((*compare_element_TB) (new_node->element, current_node->element, option) < 1) { /*Je regarde si mon noeud doit etre inserer a gauche ou a droite*/
  19. current_node = current_node->left_son;
  20. }
  21. else {
  22. current_node = current_node->right_son;
  23. }
  24. }
  25. new_node->father = father_node;
  26. if ((*compare_element_TB) (new_node->element, father_node->element, option) < 1) { /*Je regarde si mon noeud doit etre inserer a gauche ou a droite*/
  27. father_node->left_son = new_node;
  28. }
  29. else {
  30. father_node->right_son = new_node;
  31. }
  32. }
  33.  
  34. /*Recherche d'un élément dans l'arbre*/
  35. p_TBNode TBNode::find_node (void *required_element, int (*compare_element_TB) (void *, void *, void *), void *option) {
  36. if (!compare_element_TB (required_element, this->element, option)) {
  37. return this;
  38. }
  39. if ((*compare_element_TB) (required_element, this->element, option) < 1) { /*Je regarde si l'élément recherché est à gauche ou à droite du noeud courant*/
  40. return this->left_son->find_node (required_element, compare_element_TB, option); /*Recursivité sur le fils gauche*/
  41. }
  42. else {
  43. return this->right_son->find_node (required_element, compare_element_TB, option); /*Recursivité sur le fils droit*/
  44. }
  45. }
  46.  
  47. /*Renvoie le premier noeud qui devrait suivre le noeud en argument*/
  48. p_TBNode TBNode::find_successor (void) {
  49. p_TBNode temp_node_1, temp_node_2;
  50. if (this->right_son != NULL) {
  51. temp_node_1 = this->right_son;
  52. while (temp_node_1->left_son != NULL) {
  53. temp_node_1 = temp_node_1->left_son;
  54. }
  55. return temp_node_1;
  56. }
  57. temp_node_1 = this->father;
  58. temp_node_2 = this;
  59. while (temp_node_1 != NULL) {
  60. if (temp_node_2 == temp_node_1->right_son) {
  61. temp_node_2 = temp_node_1;
  62. temp_node_1 = temp_node_1->father;
  63. continue;
  64. }
  65. break;
  66. }
  67. return temp_node_1;
  68. }
  69.  
  70. /*Renvoie le premier noeud qui devrait précéder le noeud en argument*/
  71. p_TBNode TBNode::find_predeccessor (void) {
  72. p_TBNode temp_node_1, temp_node_2;
  73. if (this->left_son != NULL) {
  74. temp_node_1 = this->left_son;
  75. while (temp_node_1->right_son != NULL) {
  76. temp_node_1 = temp_node_1->right_son;
  77. }
  78. return temp_node_1;
  79. }
  80. temp_node_1 = this->father;
  81. temp_node_2 = this;
  82. while (temp_node_1 != NULL) {
  83. if (temp_node_2 == temp_node_1->left_son) {
  84. temp_node_2 = temp_node_1;
  85. temp_node_1 = temp_node_1->father;
  86. continue;
  87. }
  88. break;
  89. }
  90. return temp_node_1;
  91. }
  92.  
  93. p_TBNode TBNode::delete_node (p_TBNode node_to_delete) {
  94. p_TBNode temp_node_1, temp_node_2;
  95. void *temp_element;
  96. if (node_to_delete->left_son == NULL || node_to_delete->right_son == NULL) { /*Si un des deux fils du noeud à effacer est NULL*/
  97. temp_node_1 = node_to_delete; /*La premiere variable pointe sur le noeud a effacer*/
  98. }
  99. else {
  100. temp_node_1 = node_to_delete->find_successor (); /*sinon elle pointe sur le premier element qui sui le noeud a effacer*/
  101.  
  102. }
  103. if (temp_node_1->left_son != NULL) { /*Si jamais le fils gauche de la premiere variable n'est pas NULL*/
  104. temp_node_2 = temp_node_1->left_son; /*La deuxieme prend la valeur du fils gauche de la premiere*/
  105. }
  106. else {
  107. temp_node_2 = temp_node_1->right_son; /*Sinon elle prend la valeur de son fils droit*/
  108. }
  109. if (temp_node_2 != NULL) { /*Si le premier a bien un fils*/
  110. temp_node_2->father = temp_node_1->father; /*le pere de la deuxieme est le pere de la premiere variable*/
  111. }
  112. if (temp_node_1->father == NULL) { /*Si la premiere variable etait la racine*/
  113. *this = temp_node_2; /*la deuxieme devient la racine*/
  114. }
  115. else { /*Sinon je verifie si la premiere est le fils gauche de la seconde*/
  116. if (temp_node_1 == temp_node_1->father->left_son) { /*si c'est le cas alors le fils gauche de la premiere devient la seconde*/
  117. temp_node_1->father->left_son = temp_node_2;
  118. }
  119. else {
  120. temp_node_1->father->right_son = temp_node_2; /*sinon la deuxieme devient le fils droit de la premiere*/
  121. }
  122. }
  123. if (temp_node_1 != node_to_delete) { /*si la premiere nest pas le noeud a effacer, je donne a l'element a effacer l'element de la premiere variable*/
  124. temp_element = node_to_delete->element;
  125. node_to_delete->element = temp_node_1->element;
  126. temp_node_1->element = temp_element;
  127. }
  128. return temp_node_1;
  129. }

Voila, j'attend avec impatience vos conseils ^^

Autres pages sur : demande avis

Lassé par la pub ? Créez un compte

1/ evites le using namespace std...
2/ fait une classe template au lieu d'utiliser void !
3/ le nom de tes méthodes sont bizarres mais bon, passons
4/ au lieu de passer la fonction comparative a chaque insertion, il faudrait soit
a/ une méthode setComparator permettant de fixer une variable membre.
b/ en faire une méthode membre virtuelle. il faudait donc faire une classe fille spécifique
Lassé par la pub ? Créez un compte