begin process at 2012 02 10 21:22:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

parcours en profondeur dans un graphe


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

parcours en profondeur dans un graphe

dimanche 19 novembre 2006 à 15:42:48 | parcours en profondeur dans un graphe

Tavarez59282

Bonjour j'ai un sujet de tp à realiser sur les graphes à l'aide de listes d'adjacence et j'ai un incident de segmentation dans mon code lorsque j'execute. Je vous montre mes structures dans mon en tete puis le code avec en gras la partie qui pose problème. Je vois vraiment pas d'où ca vient car pourtant j'estime mon code correct donc si vous voyez ce serait bien. Merci d'avance!

/*graphe_liste.h*/
#ifndef _GRAPHE_LISTE
#include<stdio.h>
#include<stdlib.h>
#define _GRAPHE_LISTE 1

#define BLANC 0
#define GRIS 1
#define NOIR 2

typedef int SID;
typedef struct{SID *p; int ptr;}PILE;
typedef struct maillon{
SID s;
struct maillon *suivant;
}maillon;

typedef struct{int n; maillon **listes;int *pred;
int *couleur;
int *d;
int *f; }GRAPHE;

void reservation_en_memoire(int n, GRAPHE *g);
void liberation_memoire(GRAPHE *g);
void cree_graphe_vide(GRAPHE *g);
void ajouter_connection(GRAPHE *g, SID i, SID j);
void retirer_connection(GRAPHE *g, SID i, SID j);
int est_adjacent(GRAPHE *g, SID i, SID j);
int recupere_sommet_adjacent(GRAPHE *g, SID i, SID *adj, int *nbadj);
void copie_graphe(GRAPHE *g1, GRAPHE *g2);
void lire_graphe(char *nom, GRAPHE *g);
void ecrit_graphe(GRAPHE *g, char *nom);

#endif

/*graphe_liste.c seulement la partie qui ne fonctionne pas*/

void parcours_en_profondeur_recursif(GRAPHE *g, SID s)
{  
    int i, n=g->n;int *adj,*nbadj;int date=0;int voisin;
 
  for(i=0;i<n;i++)
        g->couleur[i]=BLANC;
      
    recupere_sommet_adjacent(g,s,adj,nbadj);
                          
                         if(g->couleur[s]==BLANC)
                         {
                           g->couleur[s]=GRIS;
                           date=date+1;
                           g->d[s]=date;
                          
                           for(i=0;i<(*nbadj);i++)
                          
                           {voisin=adj[i];
                           if(g->couleur[voisin]==BLANC)
                           g->pred[voisin]=s;
                           parcours_en_profondeur_recursif(g,voisin);
                           }
                           g->couleur[s]=NOIR;
                           date=date+1;
                           g->f[s]=date;
                          
                           }
                          
                     
}

PS:c'est la même erreur à chaque fois je pense on dirait qu'il n'accepte pas que je transforme le pointeur sur couleur en tableau pourtant c comme ca qu'on fait lol donc si quelqu'un a une idée.Merci encore

dimanche 19 novembre 2006 à 19:33:33 | Re : parcours en profondeur dans un graphe

laurent1024

Membre Club
A chaque fois que tu utilise des pointeurs il faut vérifier que ces pointeurs ne sont pas null.
donc quand tu fait g-> il faut faire un test avant (if(g!=NULL) g-> ...) . Comme tu utilises des pointeurs pour les couleurs, il faut aussi verifier que g->coleur != NULL. Si ton programme plante sur les lignes que tu as mis en gras, c'est qu'il doit y avoir un problème lors de la reservation de la mémoire. A mon avis vu la structure de tes fonctions, la fonction reservation_en_mémoire est la fonction qui te pose probleme.
si tu fais
GRAPHE *g = NULL;
reservation_en_memoire(10, g);
je pense que ici g va toujours valoir NULL.
Car quand tu passe g, il va avoir une recopie du pointeur dans la fonction reservation_en_memoire et tu va modifier le pointeur recopié mais pas directement g.

La solution est  la suivante:
tu modifies ta fonction reservation_en_mémoire comme ca :
void reservation_en_memoire(int n, GRAPHE **g){
 // a l'interieur de la fonction tu remplace tes g par (*g)
}

Tu peux egalement faire de cette façon
 GRAPHE * reservation_en_memoire(int n) {
    // ici tu creer ton pointeur
    GRAPHE g = malloc(....)
    ...
    return g;
}
Dans ton programme principale tu fait g =reservation_en_memoire(...);

Voila j'espere que j'ai été clair
++
lundi 20 novembre 2006 à 00:11:45 | Re : parcours en profondeur dans un graphe

Tavarez59282

Le probleme c'est qu'on nous a donné des types prédefinis donc logiquement ils ont pas de problème. De plus toutes les autres fonctions que j'ai créées s'executent correctement sans probleme de pointeurs. Donc je veux bien te croire et ca a l'air pertinent mais je ne peux pas modifier mes types donc soit ca vient d'ailleurs soit je ne comprend pas tout. Merci de ton aide
lundi 20 novembre 2006 à 09:29:28 | Re : parcours en profondeur dans un graphe

louis14

dans ce cas il faudrait voir ce qu'il y a dans réservation mémoire et est-ce que cette fonction est appelée avant l'utilisation de ta fonction

louis14
lundi 20 novembre 2006 à 22:21:40 | Re : parcours en profondeur dans un graphe

laurent1024

Membre Club

Il faut que tu essaye de debugger, en y allant étape par étape. A chaque fois que tu as un pointeur regarde sur quoi il pointeut et quand tu utilise un acces type tableau (couleur[i] par exemple) véfier que tu dépasse pas l'intervalle [0...tailledutableau-1]. Avec le code que tu as fournis j'arrive pas a voir d'ou peut provenir ton erreur.

++



Cette discussion est classée dans : graphe, int, couleur, void, sid


Répondre à ce message

Sujets en rapport avec ce message

void et int [ par xionoxid ] SalutC koi la difference entre unvoid a;et int a; ?? Snake tsssssssssss aidez moiiiiiiii [ par AmK ] Salut ,Je suis en train de coder un snake et la je crois avoir bien compris le principe de l'algo mais niveau code ça foire je sais pas pourquoi voila équation et tableaux [ par cabarrus ] je ne trouve pas l'erreur dans mon programme?#include#includeint deltanul(int);float deltainf(float);float deltasup(float);void main(void){float a,b,c une fiche de renseignement [ par cabarrus ] je cherche à faire un programme qui demande des renseignements pour pouvoir ensuite les affiché comme une fiche d'identité!!!voici monprogramme mais m Probleme fonctions [niveau debutant] [ par zzzzzz ] en fait je voulais faire une applic qui nous demande un nombre de part et de fin si on met par exemple 2 et 7 sa ecrira 234567 grace a une boucle. le getch ou getchar() ? [niveau debutant] [ par zzzzzz ] :P //---------------------------------------------------------------------------#include #include // getch()#include // c class.... [ par Tautau ] voila j'ai un petit prob lors de ma compilation et j'ai un test dessus lundi :#include "conio.h"#include "iostream.h"class C_Tableau{ private: Fch. Header :: CONIO.H [ par TontOnDuWeb ] Pour ce que ca interesse (avec vc++ les fonctions suivantes e sont pas incluse (du moins je crois...))>>#if !defined(__CONIO_H)#define __CONIO_H#if !d pb de Z-buffer ac openGL -> Help! [ par Arnaud16022 ] bonjour tt le monde!quelqun pourrait me dire pourqoui le Z-buffer marche pas?pasque le dernier (4ème) triangle dessiné apparait tjs au dessus, meme s' pb de compilation [ par norton ] bonjour, je desir compiler le code suivant mais j'ai une erreur.mon code :#include #include #include void Display();void Reshape(int,int);int main( in


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales