[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

Kelly
 
Tout le monde fait dodo??
0
Kelly
 
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 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Tu peux consulter cet article Liste doublement chaînée
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
Kelly
 
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
Kelly
 
Personne ne peut m'aider?
0
Kelly
 
De l'aide par pitié! :'(:'(:'(:'(
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
Kelly
 
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 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Tu compiles avec quoi?!
0
Kelly
 
Je travail sous Windows Vista (oui oui je sais) et je compile avec Visual C++
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

Satané Visual C++ ;-DDD

Installe code blocks , c'est gratuit http://www.codeblocks.org/downloads/binaries
0
Kelly
 
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
Kelly
 
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
Kelly
 
Vraiment rien à faire il ne veut pas compiler sous code blocks! Je m'arrache les cheveux
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

Attends un peu.
Je viens de tester avec code::blocks et ça marche
Je t'envoie l'imprimé écran
0
Kelly
 
Alors ce doit etre moi qui ais mal configurer code::blocks, je ne vois rien d'autre
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
Kelly
 
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 2449 Statut Membre 437
 
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