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 :

Exercice sur liste chainée


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    étudiante a l’école nationale d’ingénieurs de sousse
    Inscrit en
    mai 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante a l’école nationale d’ingénieurs de sousse
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : mai 2014
    Messages : 12
    Points : 15
    Points
    15
    Par défaut Exercice sur liste chainée
    Bonjour,

    pourquoi le programme ci-dessous cesse de fonctionner après l'exécution de la fonction remplir et ne fait l'affichage?!
    Est ce que vous pouvez m'aidez?

    Code c : 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
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    typedef struct
    {
    int code;
    char marq[10];
    int capacite;
    double prix;
    }ordinateur;
    struct element
    {
      ordinateur  info;
      struct element* suiv;
    };
    struct element* remplir(struct element*L)
    {
    int r;
     struct element* p,*q;
     do
     {
        p=(struct element*)malloc(sizeof(struct element));
        printf("remplir la liste \n code:\n ");
        scanf("%d",&(p->info).code);
        printf("marque:\n ");
        scanf("%s",&(p->info).marq);
        printf("capacite memoire:\n ");
        scanf("%d",&(p->info).capacite);
        printf(" prix:\n ");
        scanf("%f",&(p->info).prix);
          p->suiv=NULL;
     }
        while((p->info).code!=0);
     
         if(L==NULL)
         {
            p=L;
         }
         else
         {
             q=L;
          while(q->suiv!=NULL)
          {
            q=q->suiv;
            q->suiv=p;
          }
         }
         return(L);
    }
    void affichage (struct element* L)
    {
      struct element*p ;
      p=L;
      while(p!= NULL)
      {
        printf("le code est %d:\n",(p->info).code);
        printf("la marque est %s:\n",(p->info).marq);
        printf("la capacite est %d: \n",(p->info).capacite);
        printf("le prix est  %f: \n",(p->info).prix);
        p=p->suiv;
      }
    }
    struct element* supprime( struct element* L,int x)
    {
        struct element*p ,*q;
       int tr=0;
       p=L;
       if( ((p->info).code!=x)&&(p=NULL))
       {
           printf("l'element a supprimer n'existe pas\n");
     
       }
        if( (p->info).code==x)
        {
        L=p->suiv;
        free(p);
        }
        else
        {
            while ((tr==0)&&(p->suiv!=NULL))
                if( ((p->suiv)->info).code==x)
                tr=1;
            else
               p=p->suiv;
            if(tr==1)
            {
     
                q=p->suiv;
                p->suiv=q->suiv;
                free(q);
            }
        }
         return(L);
    }
    int main()
    {
    int x;
    struct element* L;
    L=NULL;
     remplir(L);
     printf("***\t affichage elements\t***\n ");
     affichage(L);
     printf(" donner le code de l'element a supprimer:\n");
     scanf("%d",&x);
    L= supprime(L,x);
     affichage(L);
        getch();
    }

  2. #2
    Membre actif
    Étudiant
    Inscrit en
    juin 2010
    Messages
    70
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2010
    Messages : 70
    Points : 204
    Points
    204
    Par défaut
    Bonjour

    tout d'abbord quelques commentaires n'auraient pas été de trop pour relire ton code et savoir où le programme plante.

    en C les variables passées aux fonctions sont dupliqués

    Les pointeurs ne font pas exceptions
    ->La valeur du pointeur est copiée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void f(int* p)
    {
     p=NULL;
    }
    int main(void)
    {
     int i;
     int* p=&i;
     printf("p=%p\n");//par exemple 0x123456
     f(p);
     printf("p=%p\n");//affichera 0x123456 et non 0x0
    }
    dans ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct element* remplir(struct element*L);
    et dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    L=NULL;
    remplir(L);
    //L vaut toujours NULL !
    2 solutions pour corriger ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void remplir(struct element** pListe);//donc passer &L à la fonction
    ou alors utiliser le type de retour...
    mais dans ce cas là il faudra repenser l'algorithme car la fonction renvoie NULL si on met NULL en paramètre

Discussions similaires

  1. aide sur liste chainé
    Par hamma2009 dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2010, 12h05
  2. Comparaison sur liste chainée
    Par calagan dans le forum C
    Réponses: 9
    Dernier message: 24/07/2007, 21h58
  3. Tri sur liste chainée
    Par SevSof dans le forum C
    Réponses: 16
    Dernier message: 27/05/2007, 00h45
  4. [Débutant] Pointeur sur liste chainée
    Par HaTnuX dans le forum C
    Réponses: 2
    Dernier message: 02/12/2006, 17h53

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