Rechercher : dans
Par :

[lge C] Liste chainée

Dernière réponse le 18 fév 2009 à 08:21:00 Kelly, le 21 jan 2009 à 01:26:57 
 Signaler ce message aux modérateurs

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.

Configuration: Windows Vista
Firefox 3.0.5

Meilleures réponses pour « [lge C] Liste chainée » dans :
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Liste doublement chaînée VoirLISTES DOUBLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes doublement chaînées A. Initialisation B. Insertion d'un élément dans la liste 1....
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...

1

Kelly, le 21 jan 2009 à 01:35:41

Tout le monde fait dodo??

Répondre à Kelly

2

Kelly, le 21 jan 2009 à 03:14:59

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

Répondre à Kelly

3

lami20j, le 21 jan 2009 à 06:43:14

Salut,

Tu peux consulter cet article Liste doublement chaînée 106485010510997108

Répondre à lami20j

4

Char Snipeur, le 21 jan 2009 à 08:24: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 ?
   } 
Salutation !
Char Snipeur

Répondre à Char Snipeur

5

Kelly, le 21 jan 2009 à 16:38:02

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

Répondre à Kelly

6

Kelly, le 21 jan 2009 à 16:48:46

Personne ne peut m'aider?

Répondre à Kelly

7

Kelly, le 21 jan 2009 à 17:12:08

De l'aide par pitié! :'(:'(:'(:'(

Répondre à Kelly

8

lami20j, le 21 jan 2009 à 17:43:11

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$

106485010510997108

Répondre à lami20j

9

Kelly, le 21 jan 2009 à 18:21:34

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

Répondre à Kelly

10

lami20j, le 21 jan 2009 à 18:23:48

Salut,

Tu compiles avec quoi?! 106485010510997108

Répondre à lami20j

11

Kelly, le 21 jan 2009 à 18:26:48

Je travail sous Windows Vista (oui oui je sais) et je compile avec Visual C++

Répondre à Kelly

12

lami20j, le 21 jan 2009 à 18:31:51

Re,

Satané Visual C++ ;-DDD

Installe code blocks , c'est gratuit http://www.codeblocks.org/downloads/binaries 106485010510997108

Répondre à lami20j

13

Kelly, le 21 jan 2009 à 18:33:44

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

Répondre à Kelly

14

Kelly, le 21 jan 2009 à 18:54:43

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?

Répondre à Kelly

15

Kelly, le 21 jan 2009 à 19:15:25

Vraiment rien à faire il ne veut pas compiler sous code blocks! Je m'arrache les cheveux

Répondre à Kelly

16

lami20j, le 21 jan 2009 à 19:17:20

Re,

Attends un peu.
Je viens de tester avec code::blocks et ça marche
Je t'envoie l'imprimé écran 106485010510997108

Répondre à lami20j

17

Kelly, le 21 jan 2009 à 19:19:56

Alors ce doit etre moi qui ais mal configurer code::blocks, je ne vois rien d'autre

Répondre à Kelly

18

lami20j, le 21 jan 2009 à 19:23:41

Re,

Voilà la preuve http://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. 106485010510997108

Répondre à lami20j

19

Kelly, le 21 jan 2009 à 19:29:54

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

Répondre à Kelly
Collection CommentÇaMarche.net