C++ Graphe [Probleme] SVP :S

lavoiekeven Messages postés 24 Statut Membre -  
lavoiekeven Messages postés 24 Statut Membre -
Bonjour, Voici mon programme je vois où il plante mais je ne comprend pas, De plus de crois que l'algoritme fonctionne pour recreer
une liste extraite d'un fichier txt

Exemple de fichier txt :

1 2 3 5 6
7 8 9 1 6
4 5 6 9 9 5 6 5 6

Voici l'algorithme !!!!!!!!!! :

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
using namespace std;

struct adjacent //case de la liste d'adjacence
{
char perte;
char ville;
adjacent *liste;
adjacent *bas;
};

class Graphe
{
private:
int nombre_ville; //nombre de sommet
adjacent *Capitale; // tete de la liste d'adjacence

public:
Graphe(); //constructeur
~Graphe(){} //destructeur
void chemin_plus_court(); //calule le chemin le plus avantageux
void poid_minimale();
void afficher(); // affiche la liste
};

Graphe::Graphe() //constructeur
{
char ft[20],ligne[100],ville;
int i,count = 0,pair=0;
adjacent* tmp = NULL,*courant = NULL; //tmp parcourt de cote, courant vers le bas

//DEmande le fichier d'operation
cout<<"Quelle est le nom du fichier que vous voulez traiter?"<<endl;
cin>>ft;
cout<<endl;
ifstream operation(ft); //ouverture du dossier d'operation
if (operation.fail()) //verifie s'il y a erreur d<ouverture
{
cout << "L'ouverture a echoue!";
}
else
{
do
{
operation.getline (ligne,100); //prend la ligne
i=0;
count++; //calcule le nombre de villes
ville = ligne[i]; // emmagazine le numéro de la ville
i++; //change la case regardée dans ligne
courant->perte = NULL; /////// BLOQUE ICI !!!!!!!!!!!!!!!!!!!!!!!
courant->bas = NULL;
courant->liste = NULL;
cout<<"test";
if (count = 1) //si c'est le premier element c'est la capitale
{
Capitale = courant;
courant->ville = ville; //ecrit le numéro de la ville
}
else //sinon on descent d'une case
{
courant->bas = new adjacent; //Cree des case vers le bas
courant = courant->bas; //change de case
courant->ville = ville; //ecrit le numéro de la ville
}
courant->liste = new adjacent; //cree une case vers le cote
tmp = courant->liste;

do
{
if(ligne[i] = ' ') //si c'est un espace change de case
{
i++;
continue;
}
pair = pair % 2; // c'est des couple (ville perte) rentre a zero donc ville si rendre a 1 perte
if(pair = 0 && ligne[i] >= 0 && ligne[i] <=9)
{
/* while(ligne[i] != ' ') //si c'est un nombre a plusieurs chiffre
{
num[k] = atoi(&ligne[i]);
i++;
k++;
}*/
tmp->ville = ligne[i];
pair++; //prochain sera perte
continue;
}
else
{
/*while(ligne[i] != ' ')
{
num[k] = atoi(&ligne[i]);
i++;
k++;
}*/
tmp->ville = ligne[i];
pair++; //prochain sera une ville
}
tmp->liste = new adjacent; //cree et change de case vers le cote
tmp = tmp->liste;

}while(ligne[i] != '\0'); //tant qu'on est pas a la fin de la ligne
tmp->liste = NULL; // ferme les case de cote

}while(!operation.eof());
nombre_ville = count; // rentre le nombre de villes
courant->bas = NULL; // ferme les case du bas
}
}
void Graphe::afficher() //afficher la liste d'adjacence
{
adjacent * courant = Capitale, * liste_perte; //cournt vers le bas, liste vers le coté
do
{
cout<<"La ville : "<<courant->ville<<" ";
liste_perte = courant->liste;
do
{
cout<<liste_perte->ville<<" perte = "<<liste_perte->perte<<" , ";

}while(liste_perte != NULL);
cout<<endl;
}while(courant->bas != NULL);

}
void main()
{
Graphe graphe_perte_de_ville;
graphe_perte_de_ville.afficher();
}

Merci d'avance Keven !!!!!
Configuration: visual c++ 6.0

1 réponse

  1. lavoiekeven Messages postés 24 Statut Membre
     
    j'ai réussit a trouver une parite du problème, donc j'essais de faire imprimer le liste de haut en bas sa marche mais pas de coter
    et je trouve pas le ***** problème

    fichier txt :

    1 2 3 5 6
    7 8 9 1 6
    4 5 6 9 9 5 6 5 6

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <conio.h>
    using namespace std;

    struct adjacent //case de la liste d'adjacence
    {
    char perte;
    char ville;
    adjacent *liste;
    adjacent *bas;
    };

    class Graphe
    {
    private:
    int nombre_ville; //nombre de sommet
    adjacent *Capitale; // tete de la liste d'adjacence

    public:
    Graphe(); //constructeur
    ~Graphe(){} //destructeur
    void chemin_plus_court(); //calule le chemin le plus avantageux
    void poid_minimale();
    void afficher(); // affiche la liste
    };

    Graphe::Graphe() //constructeur
    {
    char ft[20],ligne[100],ville,grandeur = 0;
    int i,count = 0,pair=0;
    adjacent* tmp = new adjacent,*courant = new adjacent; //tmp parcourt de cote, courant vers le bas
    Capitale = NULL;
    tmp = NULL;

    //DEmande le fichier d'operation
    cout<<"Quelle est le nom du fichier que vous voulez traiter?"<<endl;
    cin>>ft;
    cout<<endl;
    ifstream operation(ft); //ouverture du dossier d'operation
    if (operation.fail()) //verifie s'il y a erreur d<ouverture
    {
    cout << "L'ouverture a echoue!";
    }
    else
    {
    do
    {
    operation.getline (ligne,100); //prend la ligne
    i=0;
    count++; //calcule le nombre de villes
    ville = ligne[i]; // emmagazine le numéro de la ville
    i++; //change la case regardée dans ligne
    courant->perte = NULL; /////// BLOQUE ICI !!!!!!!!!!!!!!!!!!!!!!!
    courant->bas = NULL;
    courant->liste = NULL;
    if (count <= 1) //si c'est le premier element c'est la capitale
    {
    Capitale = courant;
    Capitale->ville = ville; //ecrit le numéro de la ville
    }
    else //sinon on descent d'une case
    {
    courant->bas = new adjacent; //Cree des case vers le bas
    courant = courant->bas; //change de case
    courant->ville = ville; //ecrit le numéro de la ville
    }
    courant->liste = new adjacent; //cree une case vers le cote
    tmp = courant->liste;

    do
    {
    i++;
    tmp->ville = ligne[i];
    i++;
    i++;
    tmp->perte = ligne[i];
    i++;
    tmp->liste = new adjacent; //cree et change de case vers le cote
    tmp = tmp->liste;

    }while(ligne[i] != '\0'); //tant qu'on est pas a la fin de la ligne
    tmp->liste = NULL; // ferme les case de cote

    }while(!operation.eof());
    nombre_ville = count; // rentre le nombre de villes
    courant->bas = NULL; // ferme les case du bas
    }
    }
    void Graphe::afficher() //afficher la liste d'adjacence
    {
    adjacent * courant = Capitale, * tmp = NULL; //cournt vers le bas, liste vers le coté
    courant = courant->liste;
    do
    {
    cout<<"La ville : "<<courant->ville<<" ";
    tmp = courant->liste;
    do
    {
    cout <<tmp->ville<<" "<< tmp->perte<<endl;
    tmp = tmp->liste;

    }while(tmp->liste != NULL);
    cout<<endl;
    courant = courant->bas;
    }while(courant->bas != NULL);

    }
    void main()
    {
    Graphe graphe_perte_de_ville;
    graphe_perte_de_ville.afficher(); //afficher la liste
    }
    0