repertoire.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #include "repertoire.h"
  2. #include <iostream>
  3. #include "utilitaires.h"
  4. #include <fstream>
  5. using namespace std;
  6. /// Tableaux triés
  7. void afficherTT(vectPersonne tab, int nb)
  8. {
  9. for (int k = 0; k < nb; ++k)
  10. {
  11. cout << tab[k].nom << ' ' << tab[k].prenom << ' ' << tab[k].num << endl;
  12. }
  13. }
  14. void ajouterTT(vectPersonne tab, int& nb, Personne p)
  15. {
  16. int k = 0;
  17. // On cherche la bonne place
  18. while (comparerPersonne(tab[k], p) && k < nb)
  19. {
  20. ++k;
  21. }
  22. // Test personne déjà présente
  23. if (egalitePersonne(tab[k], p) && k < nb)
  24. {
  25. return;
  26. }
  27. // Décalage des éléments suivants
  28. for (int i = nb - 1; i >= k; --i)
  29. {
  30. tab[i+1] = tab[i];
  31. }
  32. // Remplissage de la bonne case
  33. tab[k] = p;
  34. // Incrémentation taille
  35. nb = nb + 1;
  36. }
  37. bool rechercherTT(vectPersonne tab, int nb, Personne p)
  38. {
  39. int i = 0;
  40. while (!egalitePersonne(tab[i], p) && i < nb)
  41. {
  42. ++i;
  43. }
  44. return egalitePersonne(tab[i], p);
  45. }
  46. void supprimerTT(vectPersonne tab, int& nb, Personne p)
  47. {
  48. int i = 0;
  49. while (!egalitePersonne(tab[i], p) && i < nb)
  50. {
  51. ++i;
  52. }
  53. if (i < nb)
  54. {
  55. for (int k = i; k < nb; ++k)
  56. {
  57. tab[k] = tab [k+1];
  58. }
  59. --nb;
  60. }
  61. }
  62. void lectureRepertoireTT(vectPersonne tab, int& nb)
  63. {
  64. nb = 0;
  65. Personne g;
  66. ifstream monFlux("repertoire.txt");
  67. for (int k = 0; k < 10000; ++k)
  68. {
  69. monFlux >> g.nom >> g.prenom >> g.num;
  70. ajouterTT(tab, nb, g);
  71. }
  72. }
  73. /// Listes triées
  74. void afficherLT(ElementListe* maListe)
  75. {
  76. // Cas de base
  77. if (maListe == nullptr)
  78. {
  79. return;
  80. }
  81. // Affichage
  82. cout << maListe->valeur.nom << ' ' << maListe->valeur.prenom << ' ' << maListe->valeur.num << endl;
  83. // Appel récursif
  84. afficherLT(maListe->suivant);
  85. }
  86. ///
  87. ElementListe* ajouterLT(ElementListe* maListe, Personne p)
  88. {
  89. // Cas liste vide DONC insertion
  90. if (maListe == nullptr)
  91. {
  92. ElementListe* rep = new ElementListe;
  93. rep->valeur = p;
  94. rep->precedent = nullptr;
  95. rep->suivant = nullptr;
  96. return rep;
  97. }
  98. // Cas d'égalité
  99. if (egalitePersonne(maListe->valeur, p))
  100. {
  101. return maListe;
  102. }
  103. // Cas bout de liste et besoin d'ajouter après DONC insertion
  104. if (maListe->suivant == nullptr && comparerPersonne(maListe->valeur, p))
  105. {
  106. ElementListe* nouv = new ElementListe;
  107. nouv->valeur = p;
  108. nouv->precedent = maListe;
  109. nouv->suivant = nullptr;
  110. maListe->suivant = nouv;
  111. return maListe;
  112. }
  113. // Cas bout de liste et besoin d'ajouter avant DONC insertion
  114. if (comparerPersonne(p, maListe->valeur)/*maListe->suivant == nullptr*/) // On a forcément maListe->valeur > p
  115. {
  116. ElementListe* nouv = new ElementListe;
  117. nouv->valeur = p;
  118. nouv->precedent = nullptr;
  119. nouv->suivant = maListe;
  120. maListe->precedent = nouv;
  121. return nouv;
  122. }
  123. // Cas actuel inférieur et suivant supérieur DONC insertion
  124. if (comparerPersonne(maListe->valeur, p) && comparerPersonne(p, maListe->suivant->valeur))
  125. {
  126. ElementListe* nouv = new ElementListe;
  127. nouv->valeur = p;
  128. nouv->precedent = maListe;
  129. nouv->suivant = maListe->suivant;
  130. maListe->suivant = nouv;
  131. nouv->suivant->precedent = nouv;
  132. return maListe;
  133. }
  134. // Cas actuel inférieur et suivant inférieur DONC appel récursif
  135. ElementListe* rep = maListe;
  136. rep->suivant = ajouterLT(maListe->suivant, p);
  137. return rep;
  138. }
  139. bool rechercherLT(ElementListe* maListe, Personne p)
  140. {
  141. // Cas où la liste est vide
  142. if (maListe == nullptr)
  143. {
  144. return false;
  145. }
  146. // Cas actuel égal donc recherche aboutit
  147. else if (egalitePersonne(maListe->valeur, p))
  148. {
  149. return true;
  150. }
  151. // Cas actuel différent DONC appel récursif
  152. else
  153. {
  154. rechercherLT(maListe->suivant);
  155. }
  156. }
  157. ElementListe* supprimerLT(ElementListe* maListe, Personne p)
  158. {
  159. // Cas où la liste est vide
  160. if (maListe == nullptr)
  161. {
  162. return nullptr;
  163. }
  164. // Cas actuel est celui qu'on veut supprimer
  165. else if (egalitePersonne(maListe->valeur, p))
  166. {
  167. // Cas actuel n'est pas le premier de la liste
  168. if (maListe->precedent != nullptr)
  169. maListe->precedent->suivant = maListe->suivant;
  170. // Cas actuel n'est pas le dernier de la liste
  171. if (maListe->suivant != nullptr)
  172. maListe->suivant->precedent = maListe->precedent;
  173. return maListe->suivant;
  174. }
  175. // Cas actuel différent DONC appel récursif
  176. else
  177. {
  178. supprimerLT(maListe->suivant);
  179. }
  180. }
  181. ElementListe* lectureRepertoireLT(ifstream* flux, int iter)
  182. {
  183. // En cas de démarrage
  184. if (flux == nullptr)
  185. {
  186. flux = new ifstream("repertoire.txt");
  187. }
  188. // Cas de base
  189. if (iter >= 10000)
  190. return nullptr;
  191. // Récursivité
  192. ElementListe* rep;
  193. rep->precedent = nullptr;
  194. (*flux) >> rep->valeur.nom >> rep->valeur.prenom >> rep->valeur.num;
  195. rep->suivant = lectureRepertoireLT(flux, iter++);
  196. // Raccrochage
  197. if (rep->suivant != nullptr)
  198. {
  199. rep->suivant->precedent = rep;
  200. }
  201. // Fin
  202. return rep;
  203. }