[lge C] Liste chainée

Kelly -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Dans le cadre d'un projet je voudrais créer une ligne de métro sous forme d'une structure de données "struct Ligne1" dans laquelle j'aurais une liste de station:

"char* ligne1 [4]={"ladefense","esplanadedeladefense","pontdeneuilly","lessablons"};

Je voudrais aussi que dans cette structure il ait un pointeur qui pointe vers la station précédente et un autre qui pointe vers la station suivante de la liste char* ligne1.

je ne vois pas du tout comment faire une telle chose, ni meme si ma méthode est bonne. Pouvez vous me conseillez s'il vous plait?

Amicalement,

Kelly programmeuse désespérée.
A voir également:

57 réponses

lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

J'a compris pourquoi.
Pas de panique ;-))

Mype a raison.
En fait j'avais installé Dev C++ et code blocks a trouvé un compilateur, ce qui n'est pas ton cas puisque
codeblocks-8.02-setup.exe n'a pas un compilateur

Donc il faut télécharger codeblocks-8.02mingw-setup.exe

NOTE: The codeblocks-8.02mingw-setup.exe file includes the GCC compiler and GDB debugger from MinGW.

0
Kelly
 
J'ai téléchargé et installé la version du lien! et devinez quoi? RIEN!
0
Kelly
 
C'est pas possible! je vais revenir a visual c'est le seul qui semble bine vouloir fonctionner décemment!
Je vais chercher pourquoi il me renvoie 2 erreurs alors que chez toi ca fonctionne bien sur le meme code
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

T'avais ça avec visual

32) : error C2275: 'LigneMetro' : utilisation non conforme de ce type comme expression
32) : error C2065: 'metro' : identificateur non déclaré


Peut être qu'il faut changer la définition de structures.
Essaie ce code sur Visual.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Station{
	  char *donnee;
	  struct Station *precedent;
	  struct Station *suivant;
};

struct LigneMetro{
	  struct Station *debut;
	  struct Station *fin;
	  int taille;
};

void initialisation (struct LigneMetro * metro);
struct Station *alloc (struct Station * nouveau_element);
int insertion_dans_metro_vide (struct LigneMetro * metro, char *donnee);
int ins_fin_metro (struct LigneMetro * metro, char *donnee);
void affiche(struct LigneMetro *metro);

int main()
{
	char* ligne1 [25]={"ladefense","esplanadedeladefense",
			   "pontdeneuilly","lessablons",
			   "portemaillot","argentine",
			   "charlesdegaulleetoile"};
	  int i;
	  char *donnee;
	  donnee = malloc(50);
	  struct LigneMetro *metro;
	  metro = (struct LigneMetro *) malloc (sizeof(struct LigneMetro));
	  initialisation(metro);

	  insertion_dans_metro_vide(metro,ligne1[0]);

	  for(i=1;i<7;++i)
		  ins_fin_metro(metro,ligne1[i]);
	  affiche(metro);
	return 0;
}

/* les fonctions */
void initialisation (struct LigneMetro * metro){
	  metro->debut = NULL;
	  metro->fin = NULL;
	  metro->taille = 0;
}

struct Station *alloc (struct Station * nouveau_element){
	  if ((nouveau_element = (struct Station *) malloc (sizeof (struct Station))) == NULL)
		  return NULL;
	  if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char))) == NULL)
		  return NULL;
	  return nouveau_element;
}


int insertion_dans_metro_vide (struct LigneMetro * metro, char *donnee){
  struct Station *nouveau_element;
  if ((nouveau_element = alloc (nouveau_element)) == NULL)
    return -1;
  strcpy (nouveau_element->donnee, donnee);
  nouveau_element->precedent = NULL;
  nouveau_element->suivant = NULL;
  metro->debut = nouveau_element;
  metro->fin = nouveau_element;
  metro->taille++;
  return 0;
}

int ins_fin_metro (struct LigneMetro * metro, char *donnee){
	struct Station *nouveau_element;
	if ((nouveau_element = alloc (nouveau_element)) == NULL)
		return -1;
	strcpy (nouveau_element->donnee, donnee);
	nouveau_element->suivant = NULL;
	nouveau_element->precedent = metro->fin;
	metro->fin->suivant = nouveau_element;
	metro->fin = nouveau_element;
	metro->taille++;
	return 0;
}


void affiche(struct LigneMetro *metro){
	struct Station *courant;
	courant = metro->debut;
	printf("[ ");
	while(courant != NULL){
		printf("%s ",courant->donnee);
		courant = courant->suivant;
	}
	printf("]\n");
}


Sinon essaie avec Dev C++ http://www.commentcamarche.net/telecharger/telecharger 59 dev c

En fait tu peux faire comme moi.
Tu installes Dev C++ et ensuite code::blocks et tu peux tester sur les deux
0

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

Posez votre question
Kelly
 
Ok je vais faire comme ça alors! je poste dès que j'ai testé
0
Kelly
 
Ca fonctionne très bien sous dev cpp! merci!

C'est reparti pour un tour ^^
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

Je pense qu'on peut mettre en résolu.
0
Kelly
 
J'ai créé toutes mes lignes de métro! Ca fonctionne très bien mais quelque chose m'échappe: le code crée la premiere station (là tout va bien) mais après il met toutes les autres stations dans la suite de la ligne sans boucle, comment est ce possible?
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

Colle ici ta fonction main pour voir
0
Kelly
 
la voilà:

int main()
{
char* ligne1 [25]={"ladefense","esplanadedeladefense","pontdeneuilly","lessablons","portemaillot","argentine","charlesdegaulleetoile","georgev","franklindroosevelt","champselyseesclemenceau","concorde","tuileries","palaisroyalmuséedulouvre","louvrerivoli","châtelet","hôteldeville","saintpaul","bastille","garedelyon","reuillydiderot","nation","portedevincennes","saintmande","berault","chateaudevincennes"};
char* ligne2 [25]={"portedauphine","victorhugo","charlesdegaulleetoile","ternes","courcelles","monceau","villiers","rome","placedeclichy","blanche","pigalle","anvers","barbèsrochechouart","lachapelle","stalingrad","jaures","colonelfabien","belleville","couronnes","menilmontant","perelachaise","philippeauguste","alexandredumas","avron","nation"};
char* ligne5 [22]={"bobignypablopicasso","bobignypantinraymondqueneau","eglisedepantin","hoche","portedepantin","ourcq","laumière","jaures","stalingrad","garedunord","garedelest","jacquesbonsergent","republique","oberkampf","richardlenoir","breguetsabin","bastille","quaidelarapee","garedausterlitz","saintmarcel","campoformio","placeditalie"};
char* ligne11 [13]={"chatelet","hoteldeville","rambuteau","artsetmetiers","republique","goncourt","belleville","pyrenees","jourdain","placesdefetes","telegraphe","portedeslilas","mairiedeslilas"};
char* ligne9 [37]={"pontdesevres","billancourt","marcelsembat","portedesaintcloud","exelmans","michelangemolitor","michelangeauteuil","jasmin","ranelagh","lamuette","ruedelapompe","trocadero","iena","almamarceau","franklindroossevelt","saintphilipeduroule","miromesnil","saintaugustin","havrecaumartin","chausseedantinlafayette","richelieudrouot","grandsboulevards","bonnenouvelle","strasbourgsaintdenis","république","oberkampf","saintambroise","voltaire","charonne","ruedesboulets","nation","buzenval","maraichers","portedemontreuil","robespierre","croixdechavaux","mairiedemontreuil"};
char* ligne8 [37]={"balard","lourmel","boucicaut","felixfaure","commerce","lamottepicquetgrenelle","ecolemilitaire","latourmaubourg","invalides","concorde","madeleine","opera","richelieudrouot","grandsboulevards","bonnenouvelle","strasbourgsaintdenis","republique","fillesducalvaire","saintsebastienfroissart","cheminvert","bastille","ledrurollin","faidherbechlaigny","reuillydiderot","montgallet","daumesnil","michelbizot","portedoree","portedecharanton","liberte","charantonecoles","ecoleveterinaire","maisonalfortstade","maisonalfortlesjuilliottes","creteillechat","creteiluniversite","creteilprefecture"};
int i;
char *donnee;
donnee = malloc(70);
struct LigneMetro *metro;
metro = (struct LigneMetro *) malloc (sizeof(struct LigneMetro));
initialisation(metro);

insertion_dans_metro_vide(metro,ligne1[0]);
for(i=1;i<25;++i)
ins_fin_metro(metro,ligne1[i]);
affiche(metro);

insertion_dans_metro_vide(metro,ligne2[0]);
for(i=1;i<25;++i)
ins_fin_metro(metro,ligne2[i]);
affiche(metro);

insertion_dans_metro_vide(metro,ligne5[0]);
for(i=1;i<22;++i)
ins_fin_metro(metro,ligne5[i]);
affiche(metro);

insertion_dans_metro_vide(metro,ligne8[0]);
for(i=1;i<37;++i)
ins_fin_metro(metro,ligne8[i]);
affiche(metro);

insertion_dans_metro_vide(metro,ligne9[0]);
for(i=1;i<37;++i)
ins_fin_metro(metro,ligne9[i]);
affiche(metro);

insertion_dans_metro_vide(metro,ligne11[0]);
for(i=1;i<13;++i)
ins_fin_metro(metro,ligne11[i]);
affiche(metro);

system("PAUSE");
return 0;
}
0
Kelly
 
C'est bon j'ai compris, ce sont les boucles for qu'il y a dans le main qui créent la ligne! suis-je bête!
0
Kelly
 
Voilà le code tel qu'il est maintenant, le programme fonctionne très bien.
Maintenant je voudrais créer des inter-connections entre les lignes quand elles ont une station en commum, pour créer les correspondances. Mais ça me pose un gros problème puisque chaque station ne possède que deux pointeurs, l'un vers la station précédente de la meme ligne l'autre vers la station suivante de la meme ligne. Si je veut créer les correspondances ça voudrait dire qu'il faut que je rajoute 4 autres pointeurs vers précédent et suivant aux stations qui sont en commun a plusieurs a ligne. Je ne vois pas du tout comment faire tout ça? avez vous une idée?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Station{
char *donnee;
struct Station *precedent;
struct Station *suivant;
int num;
int poids;
};

struct LigneMetro{
struct Station *debut;
struct Station *fin;
int taille;
};

void initialisation (struct LigneMetro * metro);
struct Station *alloc (struct Station * nouveau_element);
int insertion_dans_metro_vide (struct LigneMetro * metro, char *donnee, int numligne);
int ins_fin_metro (struct LigneMetro * metro, char *donnee, int numligne);
void affiche(struct LigneMetro *metro);

int main()
{
char* ligne1 [25]={"ladefense","esplanadedeladefense","pontdeneuilly","lessablons","portemaillot","argentine","charlesdegaulleetoile","georgev","franklindroosevelt","champselyseesclemenceau","concorde","tuileries","palaisroyalmuséedulouvre","louvrerivoli","chatelet","hôteldeville","saintpaul","bastille","garedelyon","reuillydiderot","nation","portedevincennes","saintmande","berault","chateaudevincennes"};
char* ligne2 [25]={"portedauphine","victorhugo","charlesdegaulleetoile","ternes","courcelles","monceau","villiers","rome","placedeclichy","blanche","pigalle","anvers","barbèsrochechouart","lachapelle","stalingrad","jaures","colonelfabien","belleville","couronnes","menilmontant","perelachaise","philippeauguste","alexandredumas","avron","nation"};
char* ligne5 [22]={"bobignypablopicasso","bobignypantinraymondqueneau","eglisedepantin","hoche","portedepantin","ourcq","laumière","jaures","stalingrad","garedunord","garedelest","jacquesbonsergent","republique","oberkampf","richardlenoir","breguetsabin","bastille","quaidelarapee","garedausterlitz","saintmarcel","campoformio","placeditalie"};
char* ligne11[13]={"chatelet","hoteldeville","rambuteau","artsetmetiers","republique","goncourt","belleville","pyrenees","jourdain","placesdefetes","telegraphe","portedeslilas","mairiedeslilas"};
char* ligne9 [37]={"pontdesevres","billancourt","marcelsembat","portedesaintcloud","exelmans","michelangemolitor","michelangeauteuil","jasmin","ranelagh","lamuette","ruedelapompe","trocadero","iena","almamarceau","franklindroossevelt","saintphilipeduroule","miromesnil","saintaugustin","havrecaumartin","chausseedantinlafayette","richelieudrouot","grandsboulevards","bonnenouvelle","strasbourgsaintdenis","république","oberkampf","saintambroise","voltaire","charonne","ruedesboulets","nation","buzenval","maraichers","portedemontreuil","robespierre","croixdechavaux","mairiedemontreuil"};
char* ligne8 [37]={"balard","lourmel","boucicaut","felixfaure","commerce","lamottepicquetgrenelle","ecolemilitaire","latourmaubourg","invalides","concorde","madeleine","opera","richelieudrouot","grandsboulevards","bonnenouvelle","strasbourgsaintdenis","republique","fillesducalvaire","saintsebastienfroissart","cheminvert","bastille","ledrurollin","faidherbechlaigny","reuillydiderot","montgallet","daumesnil","michelbizot","portedoree","portedecharanton","liberte","charantonecoles","ecoleveterinaire","maisonalfortstade","maisonalfortlesjuilliottes","creteillechat","creteiluniversite","creteilprefecture"};
int i;
char *donnee;
donnee = malloc(70);
struct LigneMetro *metro;
metro = (struct LigneMetro *) malloc (sizeof(struct LigneMetro));
initialisation(metro);

insertion_dans_metro_vide(metro,ligne1[0],1);
for(i=1;i<25;++i)
ins_fin_metro(metro,ligne1[i],1);
affiche(metro);

insertion_dans_metro_vide(metro,ligne2[0],2);
for(i=1;i<25;++i)
ins_fin_metro(metro,ligne2[i],2);
affiche(metro);

insertion_dans_metro_vide(metro,ligne5[0],5);
for(i=1;i<22;++i)
ins_fin_metro(metro,ligne5[i],5);
affiche(metro);

insertion_dans_metro_vide(metro,ligne8[0],8);
for(i=1;i<37;++i)
ins_fin_metro(metro,ligne8[i],8);
affiche(metro);

insertion_dans_metro_vide(metro,ligne9[0],9);
for(i=1;i<37;++i)
ins_fin_metro(metro,ligne9[i],9);
affiche(metro);

insertion_dans_metro_vide(metro,ligne11[0],11);
for(i=1;i<13;++i)
ins_fin_metro(metro,ligne11[i],9);
affiche(metro);

system("PAUSE");
return 0;
}

/* les fonctions */
void initialisation (struct LigneMetro * metro){
metro->debut = NULL;
metro->fin = NULL;
metro->taille = 0;
}

struct Station *alloc (struct Station * nouveau_element){
if ((nouveau_element = (struct Station *) malloc (sizeof (struct Station))) == NULL)
return NULL;
if ((nouveau_element->donnee = (char *) malloc (70 * sizeof (char))) == NULL)
return NULL;
return nouveau_element;
}

int insertion_dans_metro_vide (struct LigneMetro * metro, char *donnee,int numligne){
struct Station *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->num=numligne;
nouveau_element->precedent = NULL;
nouveau_element->suivant = NULL;
metro->debut = nouveau_element;
metro->fin = nouveau_element;
metro->taille++;
return 0;
}

int ins_fin_metro (struct LigneMetro * metro, char *donnee,int numligne){
struct Station *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->num=numligne;
nouveau_element->suivant = NULL;
nouveau_element->precedent = metro->fin;
metro->fin->suivant = nouveau_element;
metro->fin = nouveau_element;
metro->taille++;
return 0;
}

void affiche(struct LigneMetro *metro){
struct Station *courant;
courant = metro->debut;
printf("ligne %d: [ ",courant->num);
while(courant != NULL){
printf("%s, ",courant->donnee);
courant = courant->suivant;
}
printf("]\n\n\n");
}
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
salut.
que d'enmerde avec le compilateur ! Le plus simple au lieu de se faire chier avec des outils finalement assez comliquer à configurer aurait été d'utiliser la ligne de commande.

Pour tes correspondance, il suffit de modifier ta structure station pour rajouter un pointeur de pointeur sur une station correspondance.
C'est alors un tableau que tu rempli, tu peux aussi éventuellement ajouter un entier pour compter le nombre correspondance.
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Le plus simple au lieu de se faire chier avec des outils finalement assez comliquer à configurer aurait été d'utiliser la ligne de commande


Ce n'est pas le reflexe que j'ai quand je suis sur Win (environ 0,0000000.............1% de temps que je passe sur PC) ;-))), mais tu as raison.
0
imanou
 
Bonjour à tous,

Je voudrai créer une liste de stations de métro en C++. Je sais qu'il faut créer une classe pour ça où on déclare un pointeur sur l'élement suivant et un autre vers l'element précedent sauf que là je suis larguée.Je remercierai du fond du coeur celui ou celle qui pourra bien m'aider!!!

Une débutante programmeuse deséspérée!!
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Tout est là, que veux tu de plus ?
0
imanou
 
mais vous éte surs qu'il ne faut pas creer une classe dans laquelle on mettrait deux pointeurs?? Parce que le souci dans tout ca c est que tout mon code doit etre codé en C++!!!
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Oui, il faut en créer, et c'est ce qui est fait juste au dessus !!!
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Le plus gros souci c'est que tu utilises un post dont l'intitulé est : [lge C] Liste chainée.
Si tu veux, tu peux continuer à poser des questions ici : http://www.commentcamarche.net/forum/affich 11096561 liste chainee en c?#1
Cdlt
0