IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

parcours en largeur dans un graphe


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Points : 10
    Points
    10
    Par défaut parcours en largeur dans un graphe
    Salut.
    Je galère pour faire un parcours en largeur, j'ai fait une file pour la gérer mais le programme ne s'arrête pas quand il est exécuté.Voici les fonctions et procédure BFS!
    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
    /*--------------------------------------------------------------
    --procedure bfs
    --------------------------------------------------------------*/
     
    void procedure_bfs (sommet pivot, File * file)
    {
    	int res_file, vide, v_ordre, vide_1;
    	sommet x;
    	File *  successeurs;
     
    	printf("fonction procedure");	
    	res_file = enfiler(file, pivot);
    	if(res_file == 1){
    		pivot.marque = 1;
    		vide = est_vide(file);
    		while(vide == 1){
    			pivot = defiler(file);
    			ordre = ordre + 1;
    			v_ordre = ordre;
    			successeurs = remplir_succ(pivot); //renvoie les successeurs de pivot
    			vide_1 = est_vide(successeurs);
    			while( vide_1 == 1 ){
                       x = defiler(successeurs);
                       if(x.marque == 0){
    					enfiler(file, x);
    					x.marque = 1;
    					vide_1 = est_vide(successeurs);
    			       }
    			}
    		}
    	}
     
    }
     
    /*----------------------------------------------------------
    --fonction BFS
    -----------------------------------------------------------*/
     
    void fonction_bfs( sommet tableau[])
    {
    	sommet pivot;
    	File *file;
    	int i;
     
    	printf("fonction bfs\n");
    	for(i = 0; i < nbr_sommet; i ++){
    		pivot = tableau[i];	
    		pivot.marque = 0;	
    	}
    	printf("fin marque \n");
    	file = creer_file();
    	for(i = 0; i < nbr_sommet; i ++)
    		pivot = tableau[i];
    		if(pivot.marque == 0){
    			procedure_bfs(pivot, file);
    		}
    	}
    }

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Il faut savoir que lorsque l'on se retrouve avec un bogue, on utilise un débogueur. Celui-ci permet de repérer facilement les problèmes, de voir leurs influences et surtout de trouver leur origine pour les corriger proprement.

    Donc je vous conseille de vous munir et d'apprendre à utiliser cette perle que l'on appel le débogueur.

    De plus, votre code n'est pas assez commenté. Je vous propose donc d'écrire l'algorithme et son cheminement sur papier, de commenter le code et le problème apparaitra de lui même.

    Ensuite, je présume que vous gérez mal pointeurs et copie de structure. Du coup, lorsque vous modifier la marque, vous ne modifiez qu'une copie et non la marche contenue dans l'arbre. Enfin, ce n'est que mon avis, un débogueur ou des printf pourra répondre mieux que moi.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2012
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    oui effectivement le problème vient de là: marque n'est pas modifié mais du coup je ne sais pas comment modifier sa valeur!!!pouvez vous m'orienter??

  4. #4
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    Par défaut
    Pour modifier la structure pivot dans la fonction procedure_bfs, il faut lui passer l'adresse la structure, et non pas une copie de la structure, ce qui est fait dans le code.

    L'appel devient donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		if(pivot.marque == 0){
    			procedure_bfs(&pivot, file);
    La fonction procedure_bfs devient dès lors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void procedure_bfs (sommet *pivot, File * file)
    Pour adresser les membres de pivot dans la fonction, cela devient par exemple
    Ceci a pour effet de modier l'élement marque, qui est le même que celui connu par la fonction appelante.

    Attention toutefois: pivot est utilisé à de nombreux endroits dans cette fonction, il faut donc modifier toutes les lignes de code qui se rapportent à lui.

    Quid, par exemple, de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res_file = enfiler(file, pivot);
    enfiler s'attend à recevoir une variable de type sommet, pas sommet *. Soit il faut modifier la fonction enfiler, soit il faut l'appeler par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res_file = enfiler(file, *pivot);
    si enfiler n'a as besoin de modifier des élements de pivot.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

Discussions similaires

  1. LISP:parcours en largeur d'un graphe
    Par handetaker dans le forum Lisp
    Réponses: 3
    Dernier message: 18/06/2011, 19h09
  2. Optimisation d'un parcours dans un graphe
    Par jasmin59000 dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 30/01/2011, 01h51
  3. Algo optimisation de parcours dans un graphe
    Par egu07 dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 11/09/2008, 10h20
  4. Parcours en largeur d'un graphe
    Par line86 dans le forum C
    Réponses: 10
    Dernier message: 30/10/2007, 13h38
  5. Graphe - Parcours en largeur
    Par lusiole dans le forum C
    Réponses: 14
    Dernier message: 29/08/2007, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo