IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

probleme liste


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité(e)
    Invité(e)
    Par défaut probleme liste
    bonjour,
    voila j'ai un probleme avec ce programme au moment de l'execution.
    ce programme cree des maillon d'une liste bien sur
    et on entre les valeur tantque l'utulisateur entre la variable "car" o ce qui signifie oui
    mais au moment de l'execution il execute pas correctement.
    merci de m'aider si vous savez bien sur......



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct maillon *ptr;
    typedef struct maillon { 
    int val;
    ptr lien;};
    main()
    {
    int x,i;char c;ptr l,p,p1,preced;
    l=NULL;i=1;/*initialisation de la liste*/;
    printf("voulez vous introduire une valeur o/n \n");
    scanf("%c",&c);
    while(c=='o'){
    p=(ptr)malloc(sizeof(struct maillon));
    printf("la valeur du maillon%d\n",i);
    scanf("%d",&x);
    (*p).val=x;(*p).lien=NULL;
    if(i==1){
    l=p;preced=p;}
    else{ 
    (*preced).lien=p;preced=p;}
    printf("voulez vous introduire une valeur");
    scanf("%c",&c);i++;
    }
    printf("hfhfg");
    i=1;p=l;
    printf("le contenu de la liste\n");
    while(p!=NULL)
    {
    printf("le maillon %d son adresse %x sa valeur=%d son lien=%x\n",i,p,(*p).val,p->lien);
    p=(*p).lien;i++; 
    }
    system("pause");
    }
    Dernière modification par CGi ; 25/04/2006 à 20h27. Motif: Ajout balise code

  2. #2
    Membre confirmé Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Par défaut
    Tu veux pas rajouter les balises CODE ?
    C'est un peu dur a lire la ^^

  3. #3
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Balise CODE, explication du probleme plus en detail a part ca marche pas comme ca devrait marcher.

    Et meme avec la balise code, rend ton code plus lisible, rien que les définitions de variables...

  4. #4
    Membre confirmé Avatar de elvivo
    Inscrit en
    Mai 2002
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 105
    Par défaut
    Comme je venais de le faire pour le lire voila ^^:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct maillon *ptr ;
    typedef struct maillon 
    {
        int val ;
        ptr lien ;
    } ;
     
    main()
    {
        int x, i ;
        char c ;
        ptr l, p, p1, preced ;
        l = NULL ;
        i = 1 ; /*initialisation de la liste*/
        printf("voulez vous introduire une valeur o/n \n") ;
        scanf("%c", &c) ;
        while (c == 'o')
        {
            p = (ptr)malloc(sizeof(struct maillon)) ;
            printf("la valeur du maillon%d\n", i) ;
            scanf("%d", &x) ;
            (*p).val = x ;
            (*p).lien = NULL ;
            if (i == 1)
            {
                l = p ;
                preced = p ;
            }
            else
            {
                (*preced).lien = p ;
                preced = p ;
            }
            printf("voulez vous introduire une valeur") ;
            scanf("%c", &c) ;
            i++ ;
        }
        printf("hfhfg") ;
        i = 1 ;
        p = l ;
        printf("le contenu de la liste\n") ;
        while (p != NULL)
        {
            printf("le maillon %d son adresse %x sa valeur=%d son lien=%x\n", i, p, (*p).val, p->lien) ;
            p = (*p).lien ;
            i++ ;
        }
        system("pause") ;
    }

  5. #5
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Si ce n'est que tu n'a pas exposé ton probleme plus en detail, essaye de remplace tes scanf("%c", &car); par des scanf("%c%*c", &car);

  6. #6
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut
    Moi je dirais, mais j'en suis pas sûr parce que ça fait longtemps que j'ai pas fait de chaîne que ton problème vient de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    else {
      (*preced).lien = p ;
      preced = p ;
    }
    Ce serait pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    else {
      (*p).lien = preced ;
      preced = p ;
    }
    Parce que comme tu l'as fait, il me semble que ta chaîne donne un truc comme ça :
    [point de départ] ----> [2nd maillon ajouté] <----- [1er maillon ajouté]

    Et du coup, bah ta chaîne elle est pas top top chainée

  7. #7
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut
    Salut,

    Citation Envoyé par brakeche
    si vous savais bien sur......
    C'est joli ça ...

    Pour le reste, je suis d'accord avec elvivo, des balises code et une indentation correcte nous faciliterait bien la tâche

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par brakeche
    mais au moment de l'execution il execute pas correctement.
    Sacré pavé...

    Ton code corrigé et commenté...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
     
    /* -ed-
    - reindentation
    - reduction de la portee des variables...
    */
     
    #include<stdio.h>
    #include<stdlib.h>
     
    /* -ed- pour clean()... */
    #include<string.h>
     
    /* -ed-
    typedef struct maillon *ptr;
     
    ne pas masquer les pointeurs, c'est pas clair...
    */
    struct maillon
    {
       int val;
       struct maillon *lien;
    };
     
    /* -ed- pour des saisies stables et propres. */
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n');
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = fgetc(fp)) != '\n' && c != EOF)
          {
          }
       }
    }
     
    int main(void)
    {
       char c;
     
       struct maillon *preced;
     
       /* tete de la liste */
       struct maillon *l = NULL;
       /* -ed-
       */
       int i = 1; /* initialisation du compteur d'elements liste */
       printf("voulez vous introduire une valeur o/n \n");
     
       /* -ed- instable...
          scanf("%c", &c);
     
          remplace par du code eprouve...
       */
       {
          char line[4];
          fgets(line, sizeof line, stdin);
          clean(line, stdin);
          c = line[0];
       }
     
       while (c == 'o')
       {
          /* -ed-
          p = (ptr)malloc(sizeof(struct maillon));
     
          cast inutile
          ecriture inutilement complexe...
          malloc() peut echouer manque le test
          */
          struct maillon *p = malloc(sizeof * p);
          if (p != NULL)
          {
             int x;
             printf("la valeur du maillon %d\n", i);
     
             /* -ed- instable...
                scanf("%d", &x);
     
                remplace par du code eprouve...
             */
             {
                char line[8];
                fgets(line, sizeof line, stdin);
                clean(line, stdin);
                x = strtol(line, NULL, 10);
             }
     
             /* -ed- codage abscon. Le C dispose d'une syntaxe plus humaine...
                      (*p).val = x;
             */
             p->val = x;
             p->lien = NULL;
     
             /* -ed- cette methode ne m'inspire pas...
             En principe, on teste le pointeur de tete
             (ici, 'l', si j'ai bien compris)
     
             Nota. Un nom clair comme tete, ou p_tete n'aurait pas nuit...
             */
             if (i == 1)
             {
                l = p;
                preced = p;
             }
             else
             {
                preced->lien = p;
                preced = p;
             }
             /* -ed- ce 'preced' est en fait le pointeur sur le dernier element de la liste
              
             Habituellement, on gere une liste simple avec 2 pointeurs
              
             - p_head : debut
             - p_tail : fin (ou dernier)
              
             le tout regroupe dans une structure liste : 
              
             struct list
             {
                struct node *p_head;
                struct node *p_tail;
             };
              
             C'est tout de suite beaucoup plus clair...
             */
             printf("voulez vous introduire une valeur o/n \n");
             {
                char line[4];
                fgets(line, sizeof line, stdin);
                clean(line, stdin);
                c = line[0];
             }
             i++;
          }
          else
          {
             printf ("memory error\n");
             break;
          }
       }
       /* -ed-
          printf("hfhfg");
     
          debug, je suppose. Manque \n...
          */
       printf("OK at line %d\n", __LINE__);
       i = 1;
       {
          struct maillon *p = l;
          printf("le contenu de la liste\n");
          while (p != NULL)
          {
             printf("le maillon %d son adresse %x sa valeur=%d son lien=%x\n", i, p, p->val, p->lien);
             p = p->lien;
             i++;
          }
       }
     
       /* -ed- penser a liberer la memoire. */
    }
    Pose des questions si tu ne comprends pas.

Discussions similaires

  1. [javascript] Probleme liste deroulante
    Par samtheh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/12/2005, 14h13
  2. Probleme liste simplement chaînée
    Par sorry60 dans le forum C
    Réponses: 23
    Dernier message: 19/11/2005, 20h17
  3. Probleme liste chainée
    Par Raton dans le forum C++
    Réponses: 8
    Dernier message: 15/11/2005, 19h25
  4. [VB.NET] Problème liste Parent-Enfant dans DataGrid
    Par vonbier dans le forum ASP.NET
    Réponses: 7
    Dernier message: 27/01/2005, 08h53
  5. Probleme liste chainne et recursif
    Par rippoz dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 05/02/2004, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo