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 :

Problème de liste chaînée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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 : 33
    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
    Par défaut Problème de liste chaînée
    Bonjour,

    Pourriez vous m'expliquer pourquoi dans le code c ci-dessous le programme cesse de fonctionner suite à son exécution ?
    s'il vous plait répondez moi
    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
    #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
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 769
    Par défaut
    Il y a trop de choses qui ne vont pas: es-tu débutant?

    Liste non exhaustive :
    • Tu ne fais aucune pré-condition à l'entrée de tes fonctions: if (L == NULL) { return; }
    • Si tu restes en français, utilise des verbes: afficher, supprimer, ajouter... Et même plus, puisque tu codes en C il faut être plus explicite (le verbe en premier): ajouter_element, afficher_liste, supprimer_element
    • ligne 16, remplir(struct element*L): il faut passer un double pointeur
    • ligne 33, while((p->info).code!=0): donc cela veut dire que tu vas allouer p, mais n'utiliser que le dernier: fuite mémoire et liste qui n'aura que le dernier
    • ligne 37, p=L: fuite mémoire parce que tu écrases p. Et en plus il y a une erreur de logique. C'est L qui faut écraser. Et donc l'utilité du double pointeur en paramètre.
    • ligne 41, q=L: voir ci-dessus
    • ligne 52-53: tu peux faire directement struct element* p = L;
    • ligne 63, supprime( struct element* L,int x): il faut passer un double pointeur
    • ligne 68: if( ((p->info).code!=x)&&(p=NULL)) Tu fais une affection au lieu d'un test p== NULL. Et justement, il faut tester en premier p== NULL sinon p->info plante
    • Dans la méthode supprime: la variable tr ne sert à rien: ligne 80: while (((p->suiv)->info).code != x) && (p->suiv!=NULL)), et ligne 85: if ((p->suiv)->info).code == x)
    • Ligne 68: cela sert à quoi d'afficher "l'element a supprimer n'existe pas" si après tu le recherches dans ta liste? D'autant que tu ne testes que le premier élément.
    • ligne 75, L=p->suiv: Il faut un double pointeur parce que ton affection ne fonctionne pas. Et comme cela tu ne feras plus de return L

  3. #3
    Membre averti
    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 : 33
    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
    Par défaut
    Merci pour votre réponse
    oui je suis débutante en c puisque c'est la première année que j'apprend ce langage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de listes chaînées
    Par harmonia1981 dans le forum C
    Réponses: 2
    Dernier message: 18/02/2010, 11h45
  2. Réponses: 9
    Dernier message: 26/09/2007, 17h21
  3. Problème de listes chaînées ou de saisie
    Par mathrb dans le forum C
    Réponses: 7
    Dernier message: 12/03/2007, 12h52
  4. [TP 7] Problème avec les listes chaînées (error 202)
    Par thelinekioubeur dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/12/2006, 23h15
  5. Réponses: 7
    Dernier message: 26/01/2006, 12h20

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