[C]Programme qui ne m'affiche rien
Moscato
-
crabs Messages postés 908 Date d'inscription Statut Membre Dernière intervention -
crabs Messages postés 908 Date d'inscription Statut Membre Dernière intervention -
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 :
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; }
A voir également:
- [C]Programme qui ne m'affiche rien
- Programme demarrage windows - Guide
- Le clavier de mon telephone ne s'affiche plus - Guide
- Comment fermer un programme qui ne répond pas - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Message programmé iphone - Guide
7 réponses
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 :
Pour l'affichage, ne modifier pas l'ancre dans ton graph, tu perds des infos
Le main() pourrait devenir :
A+, crabs
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
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
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
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
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
Salut,
en suivant ce que tu as écrit, j'en ai déduit, les structures suivantes :
La structue LSommet correspond à quoi ?
Concernant les fonctions que j'ai écrit, il faudra tout modifier ?
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut,
La structure Graphe n'existe pas, c'est LSommet.
La déclaration de ton graphe deviendra :
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
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