[C]Programme qui ne m'affiche rien

Fermé
Moscato - 16 mai 2006 à 13:13
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 - 17 mai 2006 à 21:40
Bonjour,

j'ai écrit ces quelques fonctions pour pouvoir ajouter des sommets et des arcs dans un graphe.

Mon problème, est que je n'obtiens rien à l'affichage.

ESt-ce que vous pourriez m'aider à régler cela ?

Merci

Voici mon code :
#include <stdio.h>
#include <stdlib.h>



typedef struct cellule{
  int val;
  struct cellule *next;
}Cellule;
typedef Cellule *Liste;

typedef struct graphe{
  int size;
  Liste *adj;
}Graphe;

Cellule *CreerCellule(int val){
  Cellule *c = (Cellule*)malloc(sizeof(Cellule));
  if(c == NULL)
    return NULL;
 
  c->val = val;
  c->next = NULL;
 
  return c;
}


Liste consListe(int val, Liste liste){
  Cellule *c = CreerCellule(val);
 
  if(liste == NULL){
    c->next = liste;
    liste = c;
  }
 
  while(liste->next != NULL)
    liste = liste->next;
   
    liste->next = c;
   
    return liste;
}

Graphe *consGraph(int size){
  int i;

  Graphe *g = (Graphe*)malloc(sizeof(Graphe));
  if(g == NULL)
    return NULL;
 
  g->size = size;
 
  if(size > 0)
    g->adj = (Liste*)malloc(size*sizeof(Liste));
  else
    g->adj = NULL;
 
  for(i=0; i<size; i++)
    g->adj[i] = NULL;
 
  return g;
}

void addEdge(Graphe *g, int source, int dest){
  g->adj[source] = consListe(dest, g->adj[source]);
}

int main(void){
  Graphe *g = NULL;
  g = consGraph(3);
 
  addEdge(g,0,1);
  addEdge(g,0,2);
  addEdge(g,1,2);
 
  while(g->adj[0] != NULL){
    printf("%d ",g->adj[0]->val);
    g->adj[0] = g->adj[0]->next;
  }
 
  return 0;
}

7 réponses

crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
16 mai 2006 à 17:43
Salut,
Chez moi, ce n'est pas que ton programme n'affiche rien, c'est qu'il boucle
à l'infini.
Le problème semble venir de Liste consListe(int val, Liste liste) :
- tu devrais retourner toujours l'ancre de la liste
- ne pas rentrer dans le parcours de la liste, si la liste était vide
Ce qui peut donner :
/* ajoute un cellule en fin de liste et retourne l'ancre de la liste */
Liste consListe(int val, Liste liste)
    {
    Liste parcours ;
    Cellule* c = CreerCellule(val);
    if ( ! c ) return NULL ; /* gestion erreur minimale */

    if ( liste == NULL )
        {
        c->next = NULL ; /* plus clair que liste */
        return c ; /* la suite n'est pas necessaire */
        }

    /* recherche de la dernière cellule de la liste : attention au ; final */
    for( parcours=liste; parcours->next; parcours=parcours->next ) ;
    /*
    -- la modification de l'ancre n'est pas souhaitable --
    while ( liste->next != NULL )
        liste = liste->next;
    */
    parcours->next = c ; /* c->next=NULL grace à creerCellule() */
    return liste;
    }

Pour l'affichage, ne modifier pas l'ancre dans ton graph, tu perds des infos
Le main() pourrait devenir :
int main(void)
    {
    int i ; Liste parcours ;
    Graphe *g = NULL;
    g = consGraph(3);

    addEdge(g,0,1);
    addEdge(g,0,2);
    addEdge(g,1,2);
/*
 -- TON AFFICHAGE MODIFIE LES ANCRES DES LISTES : A PROSCRIRE --
    while(g->adj[0] != NULL)
        {
        printf("%d ",g->adj[0]->val);
        g->adj[0] = g->adj[0]->next;
        }
*/
    for( i=0; i<g->size; i++ ) /* pour tous les sommets */
        {
        printf( "Sommet %d :", i ) ;
        /* on parcours la liste */
        for( parcours=g->adj[i]; parcours; parcours=parcours->next )
            printf( " %d", parcours->val ) ;
        printf ("\n" ) ;
        }
    return 0;
    }


A+, crabs
0
Bonjour,

merci beaucoup de m'avoir corrigé.

Est-ce que tu pourrais m'indiquer ce qu'il faut modifier pour avoir des adresses IP à la place des sommets ?

Merci d'avance
0
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
16 mai 2006 à 21:33
Salut,
Si tu es sur une idée de parcours type recherche de réseau ou plus court
chemin, ta structure graphe n'est pas adapté : cas d'un graphe orienté
Pour la structure SOMMET :
- attribut du sommet (dans ton cas adresse IP)
- liste des chemins vers d'autre sommet (structure ARC), tu peux utiliser une
liste chaînée LARC.
La structure LARC contient
- un pointeur vers l'arc (structure ARC)
- un pointeur vers la structure LARC suivante
La structure ARC, contient quant à elle
- le pointeur vers le sommet destination
- les attributs du sommet (temps de parcours de la trame par exemple)
Ton graphe sera l'ancre d'une liste de sommet structure LSOMMET.
- pointeur vers la structure SOMMET (info du sommet)
- pointeur vers la structure LSOMMET suivante

Il peut sembler y avoir pas mal de structures, mais il est correct de séparer
les conteneurs (LISTE de CELLULE) des informations (CELLULE). Cela
permet par la suite d'utiliser les CELLULE dans d'autre conteneur : tableau,
matrice, arbre binaire, etc...

Par la suite tu pourra sans trop de problème appliquer un algo de recherche
du plus court chemin de type DIJKSTRA.

Un lien sur ce problème classique, mais l'implémentation est faite en C++ :
https://www.nimbustier.net/publications/djikstra/index.html

A+, crabs
0
Salut,

en suivant ce que tu as écrit, j'en ai déduit, les structures suivantes :

typedef struct {
  int ip;
  LARC * liste;
}Sommet;

typedef struct {
  ARC * arc;
  LARC * suivant;
}LARC;

typedef struct{
  Sommet * destination;
}ARC;

typedef struct {
  Sommet *info_sommet;
  LSommet * next;
}Graphe;


La structue LSommet correspond à quoi ?

Concernant les fonctions que j'ai écrit, il faudra tout modifier ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
17 mai 2006 à 05:27
Salut,
La structure Graphe n'existe pas, c'est LSommet.
La déclaration de ton graphe deviendra :
LSommet* graphe

Tu n'a aucune info à mettre sur les ARC ?
Sinon, à priori, il faut reécrire toute tes fonctions, car les structure ne
sont plus les memes...
A+, crabs
0
Bonjour,

est-ce que tu pourrais me donner des précisions (algo ou pseudo-code) sur les nouvelles fonctions à écrire ?

Merci par avance
0
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 507
17 mai 2006 à 21:40
Va voir le lien donné plus haut.
Même si c'est en C++ c'est suffisament expliquer pour être écrit en C
A+, crabs
0