Skip to content
Snippets Groups Projects
Commit 62432572 authored by Nicolas Floquet's avatar Nicolas Floquet
Browse files

Grahe devrait être bon et URL aussi, prêt MR

parent e8419383
No related branches found
No related tags found
1 merge request!15Floquet nicolas graphe v01
......@@ -188,6 +188,37 @@ void graphe_retasser(graphe* g, int* casesVides, int nbCasesVides) {
}
/** Retire les instances du sommet x dans le graphe et les remplace par -1 -1
* Indique dans un tableau quelles cases sont devenues vides, et le nombre de nouvelles cases vides
* Puis les sommets supérieurs sont renommés, ex : si x = 5, 6->5, 7->6 etc
* @param g un pointeur vers un graphe alloué en mémoire
* @param casesVides un tableau dans lequel on mettra les indices des cases vides de la matrice
* @param ptrNbCasesVides un pointeur vers le nombre de cases vides
* @param x le sommet à retirer
* O(n)
*/
void graphe_traitement_retirer_x(graphe* g, int* casesVides, int* ptrNbCasesVides, int x)
{
int i;
for(i=0; i < graphe_get_max(g); i++) {
if(g->ligne[i] == x || g->col[i] == x) { //Une arête part de x, ou arrive en x, on retire le sommet donc tout part
g->ligne[i] = -1;
g->col[i] = -1;
casesVides[(*ptrNbCasesVides)++] = i;
}
else { // Rien n'est supprimé, mais les indices des sommets > x sont décrémentés
if(g->ligne[i] > x) {
g->ligne[i]--;
}
if(g->col[i] > x) {
g->col[i]--;
}
}
}
g->premierVide -= (*ptrNbCasesVides);
}
/** Retire un sommet du graphe, assure qu'aucun sommet n'a d'arête allant vers ce dernier et qu'aucune arête ne part de celui ci.
* Puis les sommets supérieurs sont renommés, ex : si x = 5, 6->5, 7->6 etc
* @param g un pointeur vers un graphe alloué en mémoire
......@@ -199,6 +230,7 @@ void graphe_retirer_sommet(graphe* g, int x) {
int n = graphe_get_plus_grand_sommet(g), i;
if(x >= 0 && x < n) {
int nbCasesVides = 0, *casesVides = (int*) calloc(sizeof(int), graphe_get_max(g));
int* ptrNbCasesVides = &nbCasesVides;
if(!casesVides) {
printf("Erreur allocation graphe_retirer_sommet (tableau casesVides)\n");
return;
......@@ -207,22 +239,9 @@ void graphe_retirer_sommet(graphe* g, int x) {
for(i=0; i < graphe_get_max(g); i++) {
casesVides[i]--;
}
for(i=0; i < graphe_get_max(g); i++) {
if(g->ligne[i] == x || g->col[i] == x) { //Une arête part de x, ou arrive en x, on retire le sommet donc tout part
g->ligne[i] = -1;
g->col[i] = -1;
casesVides[nbCasesVides++] = i;
}
else { // Rien n'est supprimé, mais les indices des sommets > x sont décrémentés
if(g->ligne[i] > x) {
g->ligne[i]--;
}
if(g->col[i] > x) {
g->col[i]--;
}
}
}
g->premierVide -= nbCasesVides;
graphe_traitement_retirer_x(g, casesVides, ptrNbCasesVides, x);
//Maintenant on a aucune trace du sommet x, mais plein de (-1 -1) où il était (ATTENTION ON PEUT ENCORE VOIR DES SOMMETS X, MAIS CE SONT LES ANCIENS SOMMETS X+1, CECI N'EST PAS UN BUG, NE PAS DÉBUGGER)
graphe_retasser(g, casesVides, nbCasesVides);
......
......@@ -95,6 +95,19 @@ void graphe_supprimer_arete(graphe* g, int i, int j);
*/
void graphe_retasser(graphe* g, int* casesVides, int nbCasesVides);
/** Retire les instances du sommet x dans le graphe et les remplace par -1 -1
* Indique dans un tableau quelles cases sont devenues vides, et le nombre de nouvelles cases vides
* Puis les sommets supérieurs sont renommés, ex : si x = 5, 6->5, 7->6 etc
* @param g un pointeur vers un graphe alloué en mémoire
* @param casesVides un tableau dans lequel on mettra les indices des cases vides de la matrice
* @param nbCasesVides un pointeur vers le nombre de cases vides
* @param x le sommet à retirer
* O(n)
*/
void graphe_traitement_retirer_x(graphe* g, int* casesVides, int* ptrNbCasesVides, int x);
/** Retire un sommet du graphe, assure qu'aucun sommet n'a d'arête allant vers ce dernier et qu'aucune arête ne part de celui ci.
* Puis les sommets supérieurs sont renommés, ex : si x = 5, 6->5, 7->6 etc
* @param g un pointeur vers un graphe alloué en mémoire
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment