[lge C] Liste chainée

Fermé
Kelly - 21 janv. 2009 à 01:26
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 - 18 févr. 2009 à 08:21
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.

57 réponses

Tout le monde fait dodo??
0
j'ai essayé de créer une structure mais je ne comprends pas pourquoi elle ne fonctionne pas.
Elle contient un nom de station, un pointeur vers l'élément suivant et un autre sur l'élément précédent.
J'ai créé une fonction qui normalement devrait remplir une ligne de métro avec un char* ligneN [X]={"",""} mais elle ne veut pas fonctionner, je ne vois pas pourquoi! Et bien entendu Ma fonction affich non plus! raz le bol :'(
Voyez vous ce qui cloche?

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

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"};

struct Station{
char* nomStation[100];
struct station* suiv;
struct station* prec;
};
typedef struct Station* LigneMetro;

LigneMetro remplir(LigneMetro l;char* lignen){
int i;
struct LigneMetro* l;
l=malloc(sizeof(struct LigneMetro));
for(i=0;i<25;i++){
strcpy(l->nomStation,lignen[i]);
l->suiv=l
}
return l;
}

void affiche(LigneMetro l){
int i;
for(i=0;i<25;i++){
printf("%s",l->nomStation);
l=l->suiv;
}
}

int main(){
remplir(ligne1;ligne1);
affiche(ligne1);
return 0;
}
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 janv. 2009 à 06:43
Salut,

Tu peux consulter cet article Liste doublement chaînée
0
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 1 329
21 janv. 2009 à 08:24
une bonne révision des pointeurs et des listes chainées ne serait en effet pas de trop.
LigneMetro remplir(LigneMetro l;char* lignen){
  int i;
  struct LigneMetro* l;//LigneMetro est déjà un pointeur de structure, là tu fait un pointeur de pointeur
  l=malloc(sizeof(struct LigneMetro));
  for(i=0;i<25;i++){   
    strcpy(l->nomStation,lignen[i]); //cette boucle écrase à chaque itération l->nomStation, mais ne modifie pas l ! autant faire directement strcpy(l->nomStation,lignen[24]); car de toute façon, il n'est rien fait de plus au final.
    l->suiv=l; // tu modifie l->suiv pour le mettre à l. Ok, mais pourquoi ?
   } 
0

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

Posez votre question
Voila mon nouveau code, il ne fonctionne toujours pas et je pète un cable depuis hier soir!
Ce que je voudrais c'est simplement créer une ligne de métro en faisant appel a une boucle qui rentrerais les nom des station dans nomStation en recursif et qui créerait un pointeur vers l'élélement precédent (station precedente) et un vers l'élément suivant (station suivante) afin de parcourir ma ligne dans les deux sens
Pouvez vous m'aider SVP?



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

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"};


struct Station{
char* nomStation[100];
int poid=1;
struct Station* suiv;
struct Station* prec;
};
typedef struct Station* LigneMetro;


LigneMetro remplir(LigneMetro l,char* lignen){
int i;
struct Station* t = malloc(sizeof(struct Station));
for(i=0;i<25;i++){
strcpy(t->nomStation,lignen[i]);
t->suiv=l;
}
return t;
}

void affiche(LigneMetro l){
int i;
for(i=0;i<25;i++){
printf("%s",l->nomStation);
l=l->suiv;
}
}

int main(){
remplir(ligne1,ligne1);
affiche(ligne1);
return 0;
}
0
Personne ne peut m'aider?
0
De l'aide par pitié! :'(:'(:'(:'(
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 janv. 2009 à 17:43
Salut,

Tu n'as pas voulu regarder le tutoriel que je t'ai donné.
Ben, essaies de comprendre ça alors (le tutoriel est toujours à ta disposition - pour avouer, vu que je suis un paresseux, j'ai fait tout simplement copier coller depuis le tutoriel, et ensuite j'ai fait quelques modifications ;-))
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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

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

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

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

	  metro = (LigneMetro *) malloc (sizeof(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 (LigneMetro * metro){
	  metro->debut = NULL;
	  metro->fin = NULL;
	  metro->taille = 0;
}

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


int insertion_dans_metro_vide (LigneMetro * metro, char *donnee){
  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 (LigneMetro * metro, char *donnee){
	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(LigneMetro *metro){
	Station *courant;
	courant = metro->debut;
	printf("[ ");
	while(courant != NULL){
		printf("%s ",courant->donnee);
		courant = courant->suivant;
	}
	printf("]\n");
}

Exécution
lami20j@debian:~/trash$ gcc ccm36_kelly_ld_chainnee.c -o ccm36_kelly_ld_chainnee
lami20j@debian:~/trash$ ./ccm36_kelly_ld_chainnee
[ ladefense esplanadedeladefense pontdeneuilly lessablons portemaillot argentine charlesdegaulleetoile ]
lami20j@debian:~/trash$

0
Si lami20j je l'ai lu et relu , manié et remanié mon code mais rien n'y fait!
j'ai essayé de compiler ton code, il y a deux erreurs pour moi lors de la compilation que je ne comprends pas puisse que tout est déclaré:

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

voilà les lignes concernées:

int i;
char *donnee;
donnee = malloc(50);
LigneMetro *metro; //c'est la ligne 32 en question

merci bcp pour ton coup de main en tout cas
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 janv. 2009 à 18:23
Salut,

Tu compiles avec quoi?!
0
Je travail sous Windows Vista (oui oui je sais) et je compile avec Visual C++
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 janv. 2009 à 18:31
Re,

Satané Visual C++ ;-DDD

Installe code blocks , c'est gratuit http://www.codeblocks.org/downloads/binaries
0
D'accord je compil sur code blocks! Je te remercie bcp pour ton aide en tout cas, je te tient au courant de l'évolution
0
Désolée de t'embêter encore.
code blocks me dit :

"MetroM - Debug" uses an invalid compiler. Skipping...
Nothing to be done.

et ne veut pas compiler, que ce passe t il?
0
Vraiment rien à faire il ne veut pas compiler sous code blocks! Je m'arrache les cheveux
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 janv. 2009 à 19:17
Re,

Attends un peu.
Je viens de tester avec code::blocks et ça marche
Je t'envoie l'imprimé écran
0
Alors ce doit etre moi qui ais mal configurer code::blocks, je ne vois rien d'autre
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
21 janv. 2009 à 19:23
Re,

Voilà la preuve https://www.cjoint.com/?bxtwoymZwm

La seule chose que j'ai modifié c'est la ligne en surbrillance.

J'ai installé code::blocks avec les options proposée par défaut.
0
Hé bien je n'y comprends rien! j'ai aussi modifié mais toujours le meme fichu message "metrom - Debug" uses an invalid compiler. Skipping...
Nothing to be done.

Je crois que je suis maudite!
C'est pas ma configurtion de code::blocks je l'ai désintallé, réinstallé avec les parametre défauts et toujours la meme!
j'essaie avec encore une autre compilateur
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 435
21 janv. 2009 à 19:36
je pense qu'il trouve pas ton compilateur...
vas dans setting -> compiler and debugger -> toolchain executable ensuite dans la zone "compiler's installation directory" tu clique sur auto-detect s'il te detecte rien tu clique sur les "3 pti points" et tu choisis le dossier "C:\MinGW"
0