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 :

Liste chainée avec recherche et modification


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 2
    Par défaut Liste chainée avec recherche et modification
    Bonjour,
    j'essai de faire un exercice pour réaliser une liste chainée avec recherche et modification , je n'arrive pas à réaliser une recherche et une modification


    Voici l'enoncé de l'exercice :
    On désire réaliser un programme gérant un petit stock de pièces détachées .chaque pièce est caractérise par un
    Identifiant (max20car), une désignation (max30car) expliquant sommairement le type de pièce, son prix et la quantité en stock. Toutes ces données sont enregistrées dans des variables de type structure en liste chaînée. Le programme doit permettre d’introduire une nouvelle pièce, de lister toutes les pièces, de rechercher une pièce, de changer la quantité et de changer le prix d’une pièce et cela à l’aide d’un menu.
    Exemple :

    1 introduire une nouvelle piece
    2 lister toutes les pieces
    3 rechercher une piece
    4 changer la quantité d’une piece
    5 changer le prix d’une piece
    6 quitter

    Pour la recherche et le changement, le critère de recherche sera l’identifiant. la comparaison de chaîne de caractère (vecteur) directe (via==) n’est pas applicable et il faut faire appel à la fonction strcmp(chaine1,chaine2) qui retourne 0 si les deux chaînes sont identique.
    Exemple
    if(strcmp(p1->ident,p2->ident)==0)

    {Les chaines sont identiques}

    Créer des fonctions pour la saisie, l’affichage et la recherche
    voici mon programme :
    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
    #include <cstdlib>
    #include <iostream>
     
    using namespace std;
     
     
    struct Composant
        {
               char Ident[20];
               char Design[30];
               float Prix;
               int Quant;
               struct Composant *next;
               };
     
    void NouvoComposant(struct Composant *ptr)
    {
         printf("Nouvo Composant\n");
         printf("Identifiant : ");
         scanf("%s",ptr -> Ident);
         printf("Designation : ");
         scanf("%s",ptr -> Design);
         printf("Prix : ");
         scanf("%f",&(ptr -> Prix));
         printf("Quantite : ");
         scanf("%d",&(ptr -> Quant));
    } 
    void Liste(struct Composant *ptr)
    {
         struct Composant *actuel;
         actuel = ptr;
         do
                {
                 printf("Reference : %s\n",actuel ->Ident);
                 printf("Denomination : %s\n",actuel -> Design);
                 printf ("Price : %8.2f\n",actuel -> Prix);
                 printf("Quantity : %d\n\n",actuel -> Quant);
                 actuel = actuel -> next ;
                 } while (actuel != NULL);
    }
     
    int main(int argc, char *argv[])
    {
        struct Composant *first = NULL;
        struct Composant *current = NULL;
        struct Composant *previous = NULL;
        int choix;
        char Temp[10];
        // Menu
        do
        {
          printf("Menu \n\n");
          printf("1 - Introduire un composant \n");
          printf("2 - Lister les composants \n");
          printf("3 - Rechercher un composant \n");
          printf("4 - Changer la quantite d un composant \n");
          printf("5 - Changer le prix d un composant \n");
          printf("0 - Quitter \n\n");
          scanf("%d",&choix);
          switch (choix)
          {
                 case 1 :
                      {
                      if (first == NULL)
                             {
                                       first = (struct Composant *) malloc(sizeof(struct Composant));
                                       current = first ;
                                       // Introduction
                                       NouvoComposant(current);
                                       current -> next = NULL ;
                             }
                             else
                             {
                             previous = current ;
                             current = (struct Composant *) malloc(sizeof(struct Composant));
                             previous -> next = current;
                             current -> next = NULL;
                                // Introduction
                             NouvoComposant(current);
                             };
                             break;
                      };
                 case 2 :
                      {
                              Liste( first);
                              break;
                              };
                              };
     
        } while (choix !=0 );
     
     
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Merci

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Bienvenue sur le forum,

    Une critique de ton code actuel (et quelques conseils) :

    - void NouvoComposant(struct Composant *ptr)
    Pourquoi ne pas finir ici l'initialisation de la structure par ptr->next = NULL ?

    - void Liste(struct Composant *ptr)
    La fonction plante si on demande l'affichage d'une liste vide (ptr == NULL). Au lieu d'utiliser do...while, utiliser while()... ou for(...).
    actuel n'est pas nécessaire, on peut utiliser directement ptr.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Liste(struct Composant *ptr)
    {
         for( ; ptr != NULL; ptr= ptr->next)
         {
           printf("Reference : %s\n",ptr->Ident);
    ....
           printf("Quantity : %d\n\n",ptr->Quant);
         }
    }
    - main va devenir obèse si tu continues comme cela. Il est préférable de créer une fonction qui insère en queue de la liste les nouveaux articles.
    Comme tu insères en queue, il serait astucieux de décrire ta liste non pas seulement par un pointeur sur son premier élément mais aussi par un pointeur sur le dernier élément. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct List
    {
     struct Composant *first;
     struct Composant *last;
    };
    Liste() est alors légèrement modifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Liste(struct List *list)
    {
        struct Composant *ptr = list->first;     
    ....
    }
    Il est alors possible de créer une fonction comportant pour l'essentiel le code du "case 2" (où current joue le rôle du pointeur last):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct Composant * insereNouvoComposant(struct List *list)
    Le code de main devient alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      struct List list = {NULL,NULL};
    ....
      switch (choix)
      {
         case 1 : if(insereNouvoComposant(&list)== NULL) printf("Pas de mémoire\n");
                  break;
         case 2 : Liste(&list);
                  break;
      } while (choix !=0 );
    - Pour la recherche, il faut créer une fonction qui prendra en argument la liste et l'identifiant à rechercher
    et qui renvoie l'adresse de la structure Composant (ou NULL si on n'en trouve pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct Composant * Chercher(struct List * list , char * ident)
    {
      // Parcourir la liste à partir du début (comme pour Liste)
      // jusqu'à qu'on trouve l'identifiant (strcmp(ptr->Ident, ident)==0)
      // ou qu'on arrive à la fin de la liste (ptr == NULL)
      // Renvoyer ptr
    }

Discussions similaires

  1. liste chainée avec Boost
    Par vingt sens dans le forum Boost
    Réponses: 2
    Dernier message: 28/12/2015, 12h26
  2. Liste chainée avec chaine de caractère
    Par med_alpa dans le forum C
    Réponses: 4
    Dernier message: 03/01/2011, 09h06
  3. Liste déroulante de recherche et modification
    Par aurelien91 dans le forum IHM
    Réponses: 0
    Dernier message: 19/08/2009, 14h12
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. Mal a la tete avec liste chainée d'objet
    Par Raton dans le forum C++
    Réponses: 23
    Dernier message: 03/08/2005, 22h13

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