Projet tutoré 3 - Graphes
CSommet.cpp
Aller à la documentation de ce fichier.
1 /*!
2  * \file CSommet.cpp
3  * \brief Fichier contenant l'implémentation de la classe CSommet
4  * \author Guillaume ELAMBERT
5  * \author Clément NONCHER-GILLET
6  * \date 2021
7  */
8 
9 
10 #include "CSommet.h"
11 
12 
13 /*!
14  * Constructeur par défaut
15  *
16  */
18 {
21  uSOMId = 0;
22  uSOMTailleListeA = 0;
23  uSOMTailleListeS = 0;
24 }
25 
26 
27 /*!
28  * Constructeur de confort
29  *
30  * \param uNid Le numéro du sommet
31  */
32 CSommet::CSommet(unsigned int uNid) {
33 
36  uSOMId = uNid;
37  uSOMTailleListeA = 0;
38  uSOMTailleListeS = 0;
39 }
40 
41 
42 /*!
43  * Constructeur de recopie.
44  * Créé un objet CSommet copie de SOMParam.
45  *
46  * \param SOMParam L'objet CSommet à copier
47  */
49 {
50  //On fait appel à la surcharge de l'opérateur =
51  *this = SOMParam;
52 }
53 
54 
55 /*!
56  * Destructeur par défaut
57  *
58  */
60 {
61  //On appel le destructeur pour tous les arcs arrivants
62  //Et on d"salloue la liste
64 
65  for (unsigned uBoucle = 0; uBoucle < this->uSOMTailleListeA; ++uBoucle) {
66  delete pARCSOMListeArcsArrivants[uBoucle];
67  }
68 
70  }
71 
72  //On fait pareil pour les arcs sortants
74 
75  for (unsigned uBoucle = 0; uBoucle < this->uSOMTailleListeS; ++uBoucle) {
76  delete pARCSOMListeArcsSortants[uBoucle];
77  }
78 
80  }
81 }
82 
83 
84 /*!
85  * Accesseur en lecture de uSOMId.
86  *
87  * \return Le numéro du sommet
88  */
89 unsigned int CSommet::SOMGetId(void) {
90  return uSOMId;
91 }
92 
93 
94 /*!
95  * Accesseur en lecture de uSOMTailleListeArrivants.
96  *
97  * \return Le nombre d'arcs arrivants au sommet
98  */
99 unsigned int CSommet::SOMGetTailleA()
100 {
101  return uSOMTailleListeA;
102 }
103 
104 
105 /*!
106  * Accesseur en lecture de uSOMTailleListeS.
107  *
108  * \return Le nombre d'arcs partants du sommet
109  */
111 {
112  return uSOMTailleListeS;
113 }
114 
115 
116 /*!
117  * Ajoute un arc arrivant au sommet.
118  *
119  * \param uDestination La destination de l'objet CArc à ajouter à la liste des arcs arrivants
120  * \pre Il n'existe pas d'objet CArc dans la liste des arcs arrivants ayant pour destination uDestination.
121  */
122 void CSommet::SOMAjouterArcArrivant(unsigned int uDestination) {
123 
124  //Verification qu'il n'y ai pas de doublons
125  if (SOMChercherArcArrivant(uDestination) == -1) {
126 
127  CArc ** pARCNouvelleListe = (CArc **) realloc(pARCSOMListeArcsArrivants, sizeof(CArc *)*(++uSOMTailleListeA));
128 
129  //Erreur si allocation échouée
130  if (pARCNouvelleListe == NULL) {
131  throw(CException(CSOMMET_Alloc_Echouee, "CSommet::SOMAjouterArcArrivant(unsigned int uDestination) : Erreur d'allocation/réallocation.\n"));
132  }
133 
134  pARCNouvelleListe[uSOMTailleListeA-1] = new CArc(uDestination);
135  pARCSOMListeArcsArrivants = pARCNouvelleListe;
136  }
137 
138 }
139 
140 
141 /*!
142  * Retire un arc arrivant au sommet.
143  *
144  * \param uDestination La destination de l'objet CArc à supprimer de la liste des arcs arrivants
145  * \pre Il existe un objet CArc dans la liste des arcs arrivants ayant pour destination uDestination.
146  */
147 void CSommet::SOMRetirerArcArrivant(unsigned int uDestination) {
148 
149  //Entrée : il existe bien la connexion de this vers uDestination
150  if (SOMChercherArcArrivant(uDestination) != -1) {
151 
152  CArc ** pARCNouvelleListe = (CArc **) malloc(sizeof(CArc *)*(uSOMTailleListeA - 1));
153 
154  //Erreur si allocation échouée
155  if (pARCNouvelleListe == NULL) {
156  throw(CException(CSOMMET_Alloc_Echouee, "CSommet::SOMRetirerArcArrivant(unsigned int uDestination) : Erreur d'allocation.\n"));
157  }
158 
159  //On parcourt tous les arcs
160  for (unsigned uBoucle = 0, uCounter = 0; uBoucle < uSOMTailleListeA; uBoucle++) {
161 
162  //Entrée : Nous ne sommes pas sur l'arc à supprimer
163  // => On copie dan l'arc dans le nouveau tableau
164  if (pARCSOMListeArcsArrivants[uBoucle]->ARCGetDestination() != uDestination) {
165  pARCNouvelleListe[uCounter] = pARCSOMListeArcsArrivants[uBoucle];
166  ++uCounter;
167  }
168  else {
169  delete pARCNouvelleListe[uCounter];
170  }
171  }
172 
173  //On supprime l'ancien tableau et on lui assigne le nouveau
175  pARCSOMListeArcsArrivants = pARCNouvelleListe;
176 
177 
179  }
180 }
181 
182 
183 /*!
184  * Recherche l'arc arrivant ayant pour point de départ le sommet numéro uSOMIdDestination.
185  *
186  * \param uSOMIdDestination Le numéro du sommet de départ de l'arc
187  * \return La position de l'arc cherché dans la liste des arcs arrivants si il y est, -1 sinon.
188  */
189 int CSommet::SOMChercherArcArrivant(unsigned int uSOMIdDestination)
190 {
191  unsigned int uBoucle;
192 
193  //On parcourt les arcs sortants
194  for (uBoucle = 0; uBoucle < uSOMTailleListeA; uBoucle++) {
195 
196  //Entrée : On trouve un arcs ayant pour destination uSOMIdDestination
197  // => On renvoie l'index
198  if (pARCSOMListeArcsArrivants[uBoucle]->ARCGetDestination() == uSOMIdDestination) {
199  return uBoucle;
200  }
201  }
202  return -1;
203 }
204 
205 
206 /*!
207  * Lis l'arc arrivant en position uPos de la liste pARCSOMListeArcsArrivants.
208  *
209  * \param uPos La position de l'arc dans la liste pARCSOMListeArcsArrivants
210  * \pre 0 <= uPos <= uSOMTailleListeA - 1
211  * \return Objet CArc à la position uPos dans la liste des arcs entrants
212  */
213 CArc* CSommet::SOMLireListeA(unsigned int uPos)
214 {
215 
216  //Entrée : uPos est un index hors limite de la liste des arcs arrivants
217  // => On lève une erreur
218  if (uPos > uSOMTailleListeA - 1 || uPos < 0) {
219  char sExceptionMessage[255];
220  sprintf_s(sExceptionMessage, 255, "CSommet::SOMLireListeA(unsigned int uPos) : Impossible de lire l'arc d'arrivee %d.\n", uPos);
221  throw CException(CSOMMET_Lecture_Impossible, sExceptionMessage);
222  }
223 
224  return pARCSOMListeArcsArrivants[uPos];
225 }
226 
227 
228 /*!
229  * Ajoute un arc sortant au sommet.
230  *
231  * \param uDestination La destination de l'objet CArc à ajouter à la liste des arcs sortants
232  * \pre Il n'existe pas d'objet CArc dans la liste des arcs sortants ayant pour destination uDestination.
233  */
234 void CSommet::SOMAjouterArcSortant(unsigned int uDestination)
235 {
236 
237  //Verification qu'il n'y ai pas de doublons
238  if (SOMChercherArcSortant(uDestination) == -1) {
239 
240 
241  CArc ** pARCNouvelleListe = (CArc **) realloc(pARCSOMListeArcsSortants, sizeof(CArc *)*(++uSOMTailleListeS));
242 
243  //Erreur si allocation échouée
244  if (pARCNouvelleListe == NULL) {
245  throw(CException(CSOMMET_Alloc_Echouee, "CSommet::SOMAjouterArcSortant(unsigned int uDestination) : Erreur d'allocation/réallocation.\n"));
246  }
247  pARCNouvelleListe[uSOMTailleListeS-1] = new CArc(uDestination);
248  pARCSOMListeArcsSortants = pARCNouvelleListe;
249 
250  }
251 
252 }
253 
254 
255 /*!
256  * Retire un arc sortant au sommet.
257  *
258  * \param uDestination La destination de l'objet CArc à supprimer de la liste des arcs sortants
259  * \pre Il existe un objet CArc dans la liste des arcs sortants ayant pour destination uDestination.
260  */
261 void CSommet::SOMRetirerArcSortant(unsigned int uDestination)
262 {
263  //Entrée : il existe bien la connexion de this vers uDestination
264  if (SOMChercherArcSortant(uDestination) != -1) {
265 
266 
267  CArc ** pARCNouvelleListe = (CArc **) malloc(sizeof(CArc *)*(uSOMTailleListeS - 1));
268 
269  //Erreur si allocation échouée
270  if (pARCNouvelleListe == NULL) {
271  throw(CException(CSOMMET_Alloc_Echouee, "CSommet::SOMRetirerArcSortant(unsigned int uDestination) : Erreur d'allocation.\n"));
272  }
273 
274  //On parcourt tous les arcs
275  for (unsigned uBoucle = 0, uCounter = 0; uBoucle < uSOMTailleListeS; uBoucle++) {
276 
277  //Entrée : Nous ne sommes pas sur l'arc à supprimer
278  // => On copie dan l'arc dans le nouveau tableau
279  if (pARCSOMListeArcsSortants[uBoucle]->ARCGetDestination() != uDestination) {
280  pARCNouvelleListe[uCounter] = pARCSOMListeArcsSortants[uBoucle];
281  ++uCounter;
282  }
283  else {
284  delete pARCNouvelleListe[uCounter];
285  }
286  }
287 
288  //On supprime l'ancien tableau et on lui assigne le nouveau
290  pARCSOMListeArcsSortants = pARCNouvelleListe;
291 
293  }
294 }
295 
296 
297 /*!
298  * Recherche l'arc partant ayant pour point d'arrivé le sommet numéro uSOMIdDestination.
299  *
300  * \param uSOMIdDestination Le numéro du sommet d'arrivé de l'arc
301  * \return La position de l'arc cherché dans la liste des arcs sortants si il y est, -1 sinon.
302  */
303 int CSommet::SOMChercherArcSortant(unsigned int uSOMIdDestination)
304 {
305  unsigned int uBoucle;
306 
307  //On parcourt les arcs sortants
308  //=> Si on trouve un arcs ayant pour destination uSOMIdDestination : on renvoie l'index
309  for (uBoucle = 0; uBoucle < uSOMTailleListeS; uBoucle++) {
310  if (pARCSOMListeArcsSortants[uBoucle]->ARCGetDestination() == uSOMIdDestination) {
311  return uBoucle;
312  }
313  }
314  return -1;
315 }
316 
317 
318 /*!
319  * Lis l'arc en position uPos de la liste pARCSOMListeArcsSortants.
320  *
321  * \param uPos La position de l'arc dans la liste pARCSOMListeArcsSortants
322  * \pre 0 <= uPos <= uSOMTailleListeS - 1
323  * \return Objet CArc à la position uPos dans la liste des arcs sortants
324  */
325 CArc* CSommet::SOMLireListeS(unsigned int uPos)
326 {
327  //Entrée : uPos est un index hors limite de la liste des arcs sortants
328  // => On lève une erreur
329  if (uPos > uSOMTailleListeS - 1 || uPos < 0) {
330  char sExceptionMessage[255];
331  sprintf_s(sExceptionMessage, 255, "CSommet::SOMLireListeS(unsigned int uPos) : Impossible de lire l'arc de sortie %d.\n", uPos);
332  throw CException(CSOMMET_Lecture_Impossible, sExceptionMessage);
333  }
334 
335  return pARCSOMListeArcsSortants[uPos];
336 }
337 
338 
339 /*!
340  * Teste si deux sommets sont liés dans le sens *this -> SOMParam
341  *
342  * \param SOMParam L'objet CSommet dont il faut vérifier la connexion avec this
343  * \return true s'il existe un arc allant de cet objet vers SOMParam, false sinon.
344  */
345 bool CSommet::SOMLies(CSommet & SOMParam)
346 {
347  unsigned int uBoucle;
348  unsigned int uValeurTeste = 0;
349 
350  //On parcourt les arcs arrivants à SOMParam tant qu'on en a pas trouvé provenant de this
351  for (uBoucle = 0; uBoucle < SOMParam.uSOMTailleListeA && uValeurTeste == 0; uBoucle++) {
352 
353  //Entrée : on à trouvé un arc de this ayant pour destination SOMParam
354  // => on incrémente la varable qui sert à vérifier qu'on à trouvé
355  if (SOMParam.pARCSOMListeArcsArrivants[uBoucle]->ARCGetDestination() == SOMGetId()) {
356  uValeurTeste++;
357  }
358  }
359 
360  //Si on à trouvé un résultat dans la boucle précédente :
361  //On parcourt les arcs sortants des this tant qu'on en a pas trouvé ayant pour destination SOMParam
362  for (uBoucle = 0; uBoucle < uSOMTailleListeS && uValeurTeste == 1; uBoucle++) {
363  if (pARCSOMListeArcsSortants[uBoucle]->ARCGetDestination() == SOMParam.SOMGetId()) {
364  uValeurTeste++;
365  }
366  }
367 
368  //Entrée : this contient un arc sortant vers SOMParam
369  // ET SOMParam contient un arcs entrant en provenance de this
370  if (uValeurTeste == 2) {
371  return true;
372  }
373 
374  return false;
375 }
376 
377 
378 /*!
379  * Inverse les arcs entrants et sortants.
380  * Les CArcs arrivants deviennent les CArcs sortants et vice-versa
381  *
382  */
384 
385  //On copie le pointeur sur la liste des arivants
386  CArc **ARCTmp = this->pARCSOMListeArcsArrivants;
387  //On copie la taille de la liste des arivants
388  unsigned uiNbArrivants = this->uSOMTailleListeA;
389 
390  //La liste des arcs arrivants prend le pointeur sur la liste des arcs sortant, idem pour la taille
392  this->uSOMTailleListeA = this->uSOMTailleListeS;
393 
394  //La liste des arcs sortant prend le pointeur sur la liste temporaire (= liste arcs arrivants), idem pour la taille
395  this->pARCSOMListeArcsSortants = ARCTmp;
396  this->uSOMTailleListeS = uiNbArrivants;
397 
398 }
399 
400 
401 /*!
402  * Affiche le graphe sur la sortie standard.
403  *
404  */
406  unsigned int uBoucle;
407  std::cout << "L'ID du sommet est : " << uSOMId << std::endl;
408 
409  std::cout << "La liste des arcs arrivants est :" << std::endl;
410 
411  //On parcourt les arcs arrivants et on les affiche (retour à la ligne tous les 3 affichés)
412  for (uBoucle = 0; uBoucle < uSOMTailleListeA; uBoucle++) {
413  std::cout << "\t" << pARCSOMListeArcsArrivants[uBoucle]->ARCGetDestination() << ((uBoucle + 1) % 3 == 0 ? "\n" : "");
414  }
415 
416  //On évite 2 retours à la lignes successifs
417  if (uBoucle % 3 != 0){
418  std::cout << std::endl;
419  }
420 
421  std::cout << "La liste des arcs sortants est :" << std::endl;
422 
423  //On parcourt les arcs sortants et on les affiche (retour à la ligne tous les 3 affichés)
424  for (uBoucle = 0; uBoucle < uSOMTailleListeS; uBoucle++) {
425  std::cout << "\t" << pARCSOMListeArcsSortants[uBoucle]->ARCGetDestination() << ((uBoucle + 1) % 3 == 0 ? "\n" : "");
426  }
427 
428  //On évite 2 retours à la lignes successifs
429  if (uBoucle % 3 != 0){
430  std::cout << std::endl;
431  }
432  std::cout << std::endl;
433 }
434 
435 
436 
437 /*!
438  * Surcharge de l'operateur =
439  * Copie le contenu de SOMParam dans l'objet appelant
440  *
441  * \param SOMParam L'objet CSommet à copier
442  * \return Un pointeur sur l'objet appelant, copie de SOMParam
443  */
444 CSommet & CSommet::operator=(const CSommet & SOMParam)
445 {
446  if (this != &SOMParam) {
447  uSOMId = SOMParam.uSOMId;
450 
451  //On alloue les nouvelles listes des arcs
452  if ( ( pARCSOMListeArcsArrivants = (CArc **) realloc( pARCSOMListeArcsArrivants, sizeof(CArc *) * (SOMParam.uSOMTailleListeA) ) ) == NULL
453  || ( pARCSOMListeArcsSortants = (CArc **) realloc( pARCSOMListeArcsSortants , sizeof(CArc *) * (SOMParam.uSOMTailleListeS) ) ) == NULL ) {
454 
455  throw(CException(CSOMMET_Alloc_Echouee, "CSommet::operator=(const CSommet & SOMParam) : Erreur d'allocation/réallocation.\n"));
456  }
457 
458  unsigned int uBoucle;
459 
460  //On copier les arcs entrants
461  for (uBoucle = 0; uBoucle < uSOMTailleListeA; uBoucle++) {
462  pARCSOMListeArcsArrivants[uBoucle] = new CArc(*SOMParam.pARCSOMListeArcsArrivants[uBoucle]);
463  }
464 
465  //On copie les arcs sortants
466  for (uBoucle = 0; uBoucle < uSOMTailleListeS; uBoucle++) {
467  pARCSOMListeArcsSortants[uBoucle] = new CArc(*SOMParam.pARCSOMListeArcsSortants[uBoucle]);
468  }
469  }
470  return *this;
471 }
CSommet::SOMChercherArcArrivant
int SOMChercherArcArrivant(unsigned int uSOMIdDestination)
Definition: CSommet.cpp:189
CSommet::SOMGetId
unsigned int SOMGetId()
Definition: CSommet.cpp:89
CArc::ARCGetDestination
unsigned int ARCGetDestination(void)
Definition: CArc.cpp:58
CSommet::operator=
CSommet & operator=(const CSommet &SOMParam)
Definition: CSommet.cpp:444
CSommet::SOMLies
bool SOMLies(CSommet &SOMParam)
Definition: CSommet.cpp:345
CSommet.h
Fichier contenant la déclaration de la classe CSommet.
CSommet::SOMAjouterArcArrivant
void SOMAjouterArcArrivant(unsigned int uDestination)
Definition: CSommet.cpp:122
CSommet::SOMChercherArcSortant
int SOMChercherArcSortant(unsigned int uSOMIdDestination)
Definition: CSommet.cpp:303
CSommet::SOMRetirerArcArrivant
void SOMRetirerArcArrivant(unsigned int uDestination)
Definition: CSommet.cpp:147
CSommet::SOMAjouterArcSortant
void SOMAjouterArcSortant(unsigned int uDestination)
Definition: CSommet.cpp:234
CSommet::SOMInverser
void SOMInverser()
Definition: CSommet.cpp:383
CArc
Classe des arcs d'un sommet.
Definition: CArc.h:20
CSommet::SOMGetTailleA
unsigned int SOMGetTailleA()
Definition: CSommet.cpp:99
CException
Classe d'exception personnalisée.
Definition: CException.h:25
CSommet::SOMLireListeA
CArc * SOMLireListeA(unsigned int uPos)
Definition: CSommet.cpp:213
CSommet::uSOMTailleListeA
unsigned int uSOMTailleListeA
Definition: CSommet.h:33
CSommet::uSOMId
unsigned int uSOMId
Definition: CSommet.h:31
CSommet::SOMGetTailleS
unsigned int SOMGetTailleS()
Definition: CSommet.cpp:110
CSommet::pARCSOMListeArcsArrivants
CArc ** pARCSOMListeArcsArrivants
Definition: CSommet.h:32
CSommet::uSOMTailleListeS
unsigned int uSOMTailleListeS
Definition: CSommet.h:35
CSommet::pARCSOMListeArcsSortants
CArc ** pARCSOMListeArcsSortants
Definition: CSommet.h:34
CSommet
Classe des sommets d'un graphe.
Definition: CSommet.h:29
CSommet::SOMAfficherSommet
void SOMAfficherSommet()
Definition: CSommet.cpp:405
CSommet::~CSommet
~CSommet(void)
Definition: CSommet.cpp:59
CSommet::CSommet
CSommet(void)
Definition: CSommet.cpp:17
CSommet::SOMRetirerArcSortant
void SOMRetirerArcSortant(unsigned int uDestination)
Definition: CSommet.cpp:261
CSommet::SOMLireListeS
CArc * SOMLireListeS(unsigned int uPos)
Definition: CSommet.cpp:325