[langage C]Liste chainée simple
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

[langage C]Liste chainée simple



  1. #1
    invite8b421ec7

    Question [langage C]Liste chainée simple


    ------

    Bonjour,

    Voilà,je suis novice avec les listes chainées. Je sollicite votre aide.

    En fait, je souhaiterais écrire un programme permettant de lire les élements du champ de ma liste chainée et de les afficher.
    Voici ce que j'ai pu faire. Toutefois, il m'affiche des valeurs bizarre lors de l'éxécution .

    Des corrections??
    Merci par avance de votre aide.
    Code:
    #include<stdio.h>
    #include<stdlib.h>
    
    
    typedef struct noeud noeud;
    struct noeud{
       int identifiant;
       double abscisse;
       double ordonee;
       int demande;                    /*demande du client*/
       int temps_service;
       int borne_inf_tw;
       int borne_sup_tw;
       int capacite;
       struct noeud *suivant;
    
    };
    typedef noeud* llist;
    
    llist ajouter_noeud(llist liste, int id, double abs, double ord, int dde, int tps_service, int b_inf_tw, int b_sup_tw, int cap)
    {
       noeud* nouveau = malloc(sizeof(noeud));
       nouveau->identifiant = id;
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->demande = dde;
       nouveau->temps_service = tps_service;
       nouveau->borne_inf_tw = b_inf_tw;
       nouveau->borne_sup_tw = b_sup_tw;
       nouveau->capacite = cap;
       nouveau->suivant = NULL;
    
       return nouveau;
    }
    void afficher_liste(llist liste)
    {
       noeud *p = liste;
       printf("contenu de la liste\n");
       while(p!= NULL)
       {
          printf("%d %lf %lf %d %d %d %d %d\n", p->identifiant,p->abscisse, p->ordonee, p->demande, p->temps_service, p->borne_inf_tw, p->borne_sup_tw, p->capacite);
          p = p->suivant;
       }
    }
    int main (void)
    {
       llist ma_liste = NULL;
       int id;
       double abs;
       double ord;
       int dde;
       int tps_service;
       int b_inf_tw;
       int b_sup_tw;
       int cap;
       int i;
       FILE *fp;
    
       if(ma_liste!= NULL)
          printf("la liste est non vide \n");
       fp = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
    	if(fp == NULL)
    	{
    		printf("Impossible d'ouvrir fichier donnees .txt \n");
    		exit (-1);
    	}
    
    	while (fscanf(fp,"%d %lf %lf %d %d %d %d", &id, &abs, &ord, &dde, &tps_service, &b_inf_tw, &b_sup_tw, &cap)== 8)
       ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
       for(i=0;i<7;i++)
       {
          ma_liste = ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
       }
    
       afficher_liste(ma_liste);
       fclose (fp);
    
       getchar();
    	return EXIT_SUCCESS;
    
    }
    }
    Fichier donnée
    0 12,23 -12,33 +3 1 1 5 4
    1 10, 11 22, 10 -1 1 1 7 4
    2 22, 34 12,34 -2 1 1 9 4
    3 42,33 23,24 +4 1 1 10 4
    4 15,66 17,89 -2 1 1 14 4
    5 22, 13 42,35 -2 1 1 20 4

    -----

  2. #2
    bzh_nicolas

    Re : [langage C]Liste chainée simple

    Tu crées bien tes noeuds mais tu ne les ajoutes nulle part dans ta liste !
    Sinon :
    Code:
    if(ma_liste!= NULL)
      printf("la liste est non vide \n");
    Ce test ne sert à rien, à ce niveau ta liste est forcément NULL.

    Code:
    while (fscanf(fp,"%d %lf %lf %d %d %d %d", &id, &abs, &ord, &dde, &tps_service, &b_inf_tw, &b_sup_tw, &cap)== 8)
      ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
    for(i=0;i<7;i++)
    {
      ma_liste = ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
    }
    Là je ne comprends pas trop ce que tu veux faire...
    Tu lis ton fichier, en créant les noeuds, puis tu crées et affectes affectes 6 fois un noeud contenant les dernières valeurs lues.

    Enfin, tu as une parenthèse fermante en trop à la fin...

  3. #3
    invite8b421ec7

    Question Re : [langage C]Liste chainée simple

    Citation Envoyé par bzh_nicolas Voir le message
    Code:
    while (fscanf(fp,"%d %lf %lf %d %d %d %d", &id, &abs, &ord, &dde, &tps_service, &b_inf_tw, &b_sup_tw, &cap)== 8)
      ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
    for(i=0;i<7;i++)
    {
      ma_liste = ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
    }
    Là je ne comprends pas trop ce que tu veux faire...
    Tu lis ton fichier, en créant les noeuds, puis tu crées et affectes affectes 6 fois un noeud contenant les dernières valeurs lues.
    Merci pour votre réponse.
    Je cherche à remplir l'élement de la liste par les lignes fichier de données.
    Je ne vois pas comment faire?

    Merci.

  4. #4
    Jack
    Modérateur

    Re : [langage C]Liste chainée simple

    bzh_nicolas aimerait connaitre l'utilité du for. En effet, c'est bizarre. Tu veux mettre 7 noeuds identiques dans ta liste?

    Personnellement, je ne comprends pas ceci
    Code:
    while (fscanf(fp,"%d %lf %lf %d %d %d %d", &id, &abs, &ord, &dde, &tps_service, &b_inf_tw, &b_sup_tw, &cap)== 8)    
        ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
    car tu vas créer des noeuds qui seront irrémédiablement perdus car non liés à ta liste.

    A+

  5. A voir en vidéo sur Futura
  6. #5
    invite8b421ec7

    Question Re : [langage C]Liste chainée simple

    Citation Envoyé par Jack Voir le message
    bzh_nicolas aimerait connaitre l'utilité du for. En effet, c'est bizarre. Tu veux mettre 7 noeuds identiques dans ta liste?

    Personnellement, je ne comprends pas ceci
    Code:
    while (fscanf(fp,"%d %lf %lf %d %d %d %d", &id, &abs, &ord, &dde, &tps_service, &b_inf_tw, &b_sup_tw, &cap)== 8)    
        ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
    car tu vas créer des noeuds qui seront irrémédiablement perdus car non liés à ta liste.

    A+
    Merci pour votre réponse.
    Bon je vois un peu.
    J'essaye de corriger.
    Là, il m'affiche des données bizarres

    Code:
    #include<stdio.h>
    #include<stdlib.h>
    
    
    typedef struct noeud noeud;
    struct noeud{
       int identifiant;
       double abscisse;
       double ordonee;
       int demande;                    /*demande du client*/
       int temps_service;
       int borne_inf_tw;
       int borne_sup_tw;
       int capacite;
       struct noeud *suivant;
    
    };
    typedef noeud* llist;
    
    llist ajouter_noeud(llist liste, int id, double abs, double ord, int dde, int tps_service, int b_inf_tw, int b_sup_tw, int cap)
    {
       noeud* nouveau = malloc(sizeof(noeud));
       nouveau->identifiant = id;
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->demande = dde;
       nouveau->temps_service = tps_service;
       nouveau->borne_inf_tw = b_inf_tw;
       nouveau->borne_sup_tw = b_sup_tw;
       nouveau->capacite = cap;
       nouveau->suivant = NULL;
    
       return nouveau;
    }
    void afficher_liste(llist liste)
    {
       noeud *p = liste;
       printf("contenu de la liste\n");
       while(p!= NULL)
       {
          printf("%d %lf %lf %d %d %d %d %d\n", p->identifiant,p->abscisse, p->ordonee, p->demande, p->temps_service, p->borne_inf_tw, p->borne_sup_tw, p->capacite);
          p = p->suivant;
       }
    }
    int main (void)
    {
       llist ma_liste = NULL;
       int id;
       double abs;
       double ord;
       int dde;
       int tps_service;
       int b_inf_tw;
       int b_sup_tw;
       int cap;
       int i;
       FILE *fp;
    
       if(ma_liste!= NULL)
          printf("la liste est non vide \n");
       fp = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
    	if(fp == NULL)
    	{
    		printf("Impossible d'ouvrir fichier donnees .txt \n");
    		exit (-1);
    	}
    
    	fscanf(fp,"%d %lf %lf %d %d %d %d%d", &id, &abs, &ord, &dde, &tps_service, &b_inf_tw, &b_sup_&tw, cap);
       ma_liste = ajouter_noeud(ma_liste, id , abs, ord, dde, tps_service, b_inf_tw,  b_sup_tw, cap);
    
    
       afficher_liste(ma_liste);
       fclose (fp);
    
       getchar();
       return EXIT_SUCCESS;
    
    }

  7. #6
    boulbidor

    Re : [langage C]Liste chainée simple

    Je n'ais pas trop compris ta fonction
    ajouter_noeud
    Cette fonction ne fait que remplacer le pointeur sur ta liste (je suppose chaîné) par un pointeur sur le nouveau noeud que tu viens de créer.
    nouveau->suivant = NULL;;
    tu perds tout lien vers les noeuds suivant (tu perds ta liste chainée)
    ce que je te conseil, c'est :

    Code:
    llist ajouter_noeud(llist liste, int id, double abs, double ord, int dde, int tps_service, int b_inf_tw, int b_sup_tw, int cap)
    {
       noeud* nouveau = malloc(sizeof(noeud));
       nouveau->identifiant = id;
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->demande = dde;
       nouveau->temps_service = tps_service;
       nouveau->borne_inf_tw = b_inf_tw;
       nouveau->borne_sup_tw = b_sup_tw;
       nouveau->capacite = cap;
       nouveau->suivant = liste; //(mais à ce niveau je crois qu'il y aura
                                              //un probleme de type
       return nouveau;
    }
    Mais avec cette modification tu gardes un lien vers tes anciens noeud. comme ça tu ne les perds pas.

  8. #7
    invite8b421ec7

    Question Re : [langage C]Liste chainée simple

    Merci pour vos réponses.
    Cela fonctionne maintenant sauf que le programme m'affiche les meme données pour tous les noeuds. Je crois il ne fait pas la lecture de données chaque fois qu'un noeud de la liste est crée. Que dois-je faire pour régler cela?
    Merci de votre aide.
    Code:
    #include<stdio.h>
    #include<stdlib.h>
    
    
    typedef struct noeud noeud;
    struct noeud{
       int identifiant;
       double abscisse;
       double ordonee;
       int demande;                    /*demande du client*/
       int temps_service;
       int borne_inf_tw;
       int borne_sup_tw;
       int capacite;
       struct noeud *suivant;
    
    };
    typedef noeud* llist;
    
    llist ajouter_noeud(llist liste,int id,double abs,double ord,int dde,int tps_service,int b_inf_tw,int b_sup_tw,int cap)
    {
       noeud* nouveau = malloc(sizeof(noeud));
       nouveau->identifiant = id;
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->demande = dde;
       nouveau->temps_service = tps_service;
       nouveau->borne_inf_tw = b_inf_tw;
       nouveau->borne_sup_tw = b_sup_tw;
       nouveau->capacite = cap;
       nouveau->suivant = liste;
    
       return nouveau;
    }
    void afficher_liste(llist liste)
    {
       noeud *p = liste;
       printf("contenu de la liste\n");
       while(p!= NULL)
       {
          printf("%d %lf %lf %d %d %d %d %d\n",p->identifiant,p->abscisse,p->ordonee,p->demande,p->temps_service,p->borne_inf_tw,p->borne_sup_tw,p->capacite);
          p = p->suivant;
       }
    }
    int main (void)
    {
       llist ma_liste = NULL;
       int id;
       double abs;
       double ord;
       int dde;
       int tps_service;
       int b_inf_tw;
       int b_sup_tw;
       int cap;
       int i;
       FILE *fp;
    
       if(ma_liste!= NULL)
          printf("la liste est non vide \n");
       fp = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
    	if(fp == NULL)
    	{
    		printf("Impossible d'ouvrir fichier donnees .txt \n");
    		exit (-1);
    	}
    
    
       for(i=0;i<7;i++){
       fscanf(fp,"%d %lf %lf %d %d %d %d %d\n",&id,&abs,&ord,&dde,&tps_service,&b_inf_tw,&b_sup_tw,&cap);
       ma_liste = ajouter_noeud(ma_liste,id,abs,ord,dde,tps_service,b_inf_tw,b_sup_tw,cap);
       }
    
       afficher_liste(ma_liste);
       fclose (fp);
    
       getchar();
       return EXIT_SUCCESS;
    
    }

  9. #8
    bzh_nicolas

    Re : [langage C]Liste chainée simple

    Tu écrases ta liste à chaque tour de boucle avec le noeud nouvellement créé :
    Code:
    ma_liste = ajouter_noeud(ma_liste,id,abs,ord,dde,tps_service,b_inf_tw,b_sup_tw,cap);
    Enlève le "ma_liste = "
    [edit]
    oups rien dit !!
    Dernière modification par bzh_nicolas ; 02/04/2011 à 18h30.

  10. #9
    invite8b421ec7

    Red face Re : [langage C]Liste chainée simple

    Citation Envoyé par bzh_nicolas Voir le message
    Tu écrases ta liste à chaque tour de boucle avec le noeud nouvellement créé :
    Code:
    ma_liste = ajouter_noeud(ma_liste,id,abs,ord,dde,tps_service,b_inf_tw,b_sup_tw,cap);
    Enlève le "ma_lise = "
    Je n'ai pas bien compris. Faut-il faire sortir cette instruction de la boucle?

  11. #10
    bzh_nicolas

    Re : [langage C]Liste chainée simple

    essayes d'enlever l'affectation.

  12. #11
    invite8b421ec7

    Re : [langage C]Liste chainée simple

    Citation Envoyé par bzh_nicolas Voir le message
    essayes d'enlever l'affectation.
    RienLe programme n'affiche rien lors de l'exécution

  13. #12
    bzh_nicolas

    Re : [langage C]Liste chainée simple

    Citation Envoyé par celine2 Voir le message
    RienLe programme n'affiche rien lors de l'exécution
    Normal, j'ai dit une bêtise

    En fait le problème vient de ton fichier, si ce que tu nous as donné dans ton premier message est un copier-coller de ton fichier :
    Tu as des espaces dans certaine de tes données double.
    Le séparateur décimal en C (et dans la majorité des langages de programmation) est le point pas la virgule.

    P.S. j'ai une erreur de compile à cette ligne :
    Code:
    noeud* nouveau = malloc(sizeof(noeud));
    Fais un cast explicite :
    Code:
    noeud* nouveau = (noeud*)malloc(sizeof(noeud));

  14. #13
    invite8b421ec7

    Question Re : [langage C]Liste chainée simple

    Citation Envoyé par bzh_nicolas Voir le message
    Code:
    noeud* nouveau = malloc(sizeof(noeud));
    Fais un cast explicite :
    Code:
    noeud* nouveau = (noeud*)malloc(sizeof(noeud));
    Mon compilateur n'a pas detecté cette erreur.
    Je le corrige.
    Sinon dans le fichier de données le séprateur est bien une virgule
    Sinon toujours il n'affecte pas les noeuds de la chaine à leur valeurs. Il y a encore un truc qui nous échappent. Moi je ne vois pas trop.
    Voici le programme:
    Code:
    #include<stdio.h>
    #include<stdlib.h>
    
    
    typedef struct noeud noeud;
    struct noeud{
       int identifiant;
       double abscisse;
       double ordonee;
       int demande;                    /*demande du client*/
       int temps_service;
       int borne_inf_tw;
       int borne_sup_tw;
       int capacite;
       struct noeud *suivant;
    
    };
    typedef noeud* llist;
    
    llist ajouter_noeud(llist liste,int id,double abs,double ord,int dde,int tps_service,int b_inf_tw,int b_sup_tw,int cap)
    {
       noeud* nouveau = (noeud*) malloc(sizeof(noeud));
       nouveau->identifiant = id;
       nouveau->abscisse = abs;
       nouveau->ordonee = ord;
       nouveau->demande = dde;
       nouveau->temps_service = tps_service;
       nouveau->borne_inf_tw = b_inf_tw;
       nouveau->borne_sup_tw = b_sup_tw;
       nouveau->capacite = cap;
       nouveau->suivant = liste;
    
       return nouveau;
    }
    void afficher_liste(llist liste)
    {
       noeud *p = liste;
       printf("contenu de la liste\n");
       while(p!= NULL)
       {
          printf("%d %lf %lf %d %d %d %d %d\n",p->identifiant,p->abscisse,p->ordonee,p->demande,p->temps_service,p->borne_inf_tw,p->borne_sup_tw,p->capacite);
          p = p->suivant;
       }
    }
    int main (void)
    {
       llist ma_liste = NULL;
       int id;
       double abs;
       double ord;
       int dde;
       int tps_service;
       int b_inf_tw;
       int b_sup_tw;
       int cap;
       int i;
       FILE *fp;
    
       if(ma_liste!= NULL)
          printf("la liste est non vide \n");
       fp = fopen("D:\\Codes\\TS2004t3\\test.txt", "r");
    	if(fp == NULL)
    	{
    		printf("Impossible d'ouvrir fichier donnees .txt \n");
    		exit (-1);
    	}
    
    
    
       fscanf(fp,"%d %lf %lf %d %d %d %d %d\n",&id,&abs,&ord,&dde,&tps_service,&b_inf_tw,&b_sup_tw,&cap);
       for(i=0;i<7;i++){
       ma_liste=ajouter_noeud(ma_liste,id,abs,ord,dde,tps_service,b_inf_tw,b_sup_tw,cap);
    
       }
       afficher_liste(ma_liste);
       fclose (fp);
    
       getchar();
       return EXIT_SUCCESS;
    
    }
    Fichier donnée:
    0 12.20 -12.30 +1 1 5 4
    1 10,11 22.10 -1 1 1 7 4
    2 22,34 12,34 -2 1 1 9 4
    3 42,33 23,24 +4 1 1 10 4
    4 15,66 17,89 -2 1 1 14 4
    5 22,13 42,30 -2 1 1 20 4

  15. #14
    bzh_nicolas

    Re : [langage C]Liste chainée simple

    Il faut que tu remplaces les virgules par des points.
    Tu as 2 solutions pour ça :
    A la main, c'est rapide avec un éditeur de texte qui à la fonction remplacer (c'est à dire presque tous).
    Sinon, il faut lire les valeurs comme des char*, remplacer les "," par des "." puis faire un atof afin de convertir en flottant.
    Voici le fichier tel que je l'ai transformé, ton programme fonctionne avec ce fichier
    0 12.23 -12.33 +3 1 1 5 4
    1 10.11 22.10 -1 1 1 7 4
    2 22.34 12.34 -2 1 1 9 4
    3 42.33 23.24 +4 1 1 10 4
    4 15.66 17.89 -2 1 1 14 4
    5 22.13 42.35 -2 1 1 20 4

  16. #15
    boulbidor

    Re : [langage C]Liste chainée simple

    Le code est correcte. Le problème se trouve au niveau de ton fichier texte. Je parle du code de ta réponse de 17h44
    Corrige le texte de cette manière et normalement ça doit donner le bon résultat.
    Code:
    0 12.20 -12.3 3 1 1 5 4
    1 10.11 22.1 -1 1 1 7 4
    2 22.34 12.34 -2 1 1 9 4
    3 42.33 23.24 4 1 1 10 4
    4 15.66 17.89 -2 1 1 14 4
    5 22.13 42.3 -2 1 1 20 4

  17. #16
    invite8b421ec7

    Smile Re : [langage C]Liste chainée simple (Résolu)

    Citation Envoyé par bzh_nicolas Voir le message
    Il faut que tu remplaces les virgules par des points.
    Tu as 2 solutions pour ça :
    A la main, c'est rapide avec un éditeur de texte qui à la fonction remplacer (c'est à dire presque tous).
    Sinon, il faut lire les valeurs comme des char*, remplacer les "," par des "." puis faire un atof afin de convertir en flottant.
    Voici le fichier tel que je l'ai transformé, ton programme fonctionne avec ce fichier
    Celui-ci fonctionne .Effectivement, ceci est du à la forme incorrecte des valeurs dans le fichier de donnée.
    Merci beaucoup pour votre aide précieuse.

Discussions similaires

  1. Creer une liste chainée en JAVA
    Par Evil.Saien dans le forum Logiciel - Software - Open Source
    Réponses: 8
    Dernier message: 31/05/2012, 18h30
  2. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 01/01/2011, 19h18
  3. liste chainée en C
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 01/01/2011, 11h31
  4. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 11/12/2010, 15h35
  5. Liste chaînée en C - Changer un élément.
    Par invite61ab3646 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 04/11/2010, 10h40