[lge C] Liste chainée
Kelly
-
Char Snipeur Messages postés 10112 Date d'inscription Statut Contributeur Dernière intervention -
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.
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:
- [lge C] Liste chainée
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Site dangereux liste - Guide
- Voir liste d'amis facebook - Guide
57 réponses
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;
}
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;
}
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 ?
}
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;
}
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;
}
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 ;-))
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écutionlami20j@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$
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
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
Re,
Satané Visual C++ ;-DDD
Installe code blocks , c'est gratuit http://www.codeblocks.org/downloads/binaries
Satané Visual C++ ;-DDD
Installe code blocks , c'est gratuit http://www.codeblocks.org/downloads/binaries
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
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?
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?
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.
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.
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
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