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 :

Résolution d'un exercice en C [Liste chainée]


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Par défaut Résolution d'un exercice en C [Liste chainée]
    Bonjour à tous.

    Voici ma situation. Je débute dans le monde des liste chainées, et dans celui de l'allocation dynamique de la mémoire.

    Aujourd'hui je suis confronté à un problème que j'ai beaucoup de mal à résoudre pour ne pas dire que c'est "impossible" .

    Le probleme est le suivant :


    Le schéma suivant représente un annuaire des clients d’une entreprise où chaque client est caractérisé par un nom de longueur : 20 caractères et un numéro de téléphone de longueur : 15 caractères. Les clients sont organisés au sein de l’annuaire selon l’ordre alphabétique des noms. Ainsi tous les clients dont les noms commencent par la lettre « A » ou « a » sont rangés dans une liste chainée dont l’adresse est stockée à la première case du tableau A. De même les clients dont les noms commencent par « B » ou « b » sont stockés dans une liste chainée dont l’adresse est placée à la deuxième case de A. Et ainsi de suite. Le tableau A est alors un tableau de 26 case, une case par lettre de « A » à « Z »

    Schéma en pièce jointe.

    1 - Donner les déclarations nécessaires pour définir la structure de données A.

    2 - Donner le code de la fonction « ajouter » qui ajoute un client à l’annuaire. On commencera par définir la liste A[i] dans laquelle l’ajout doit se faire et on ajoute le client en tête de liste.

    3 - Donner le code de la fonction « rechercher » qui recherche le téléphone d’un client sachant son nom. On utilisera la fonction « stremp » pour comparer deux chaines.

    4 - Donner le code de la fonction « supprimer » qui supprime un client sachant son nom

    5 - Donner le code de la fonction « supprimerTout » qui supprime tous les clients dont les noms commencent par une lettre qu’on introduit au clavier.

    6 - Donner le code de la fonction « ViderTout » qui supprime tous les clients de l’annuaire.

    7 - Donner le code de la fonction « AfficherTout » qui affiche tout les clients de l’annuaire.

    Est ce que quelqu'un pourrait résoudre ce problème ?
    Une solution me permettra de comprendre.
    Je vous remercie par avance.
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    Citation Envoyé par SimoBenz Voir le message
    Est ce que quelqu'un pourrait résoudre ce problème ?
    Une solution me permettra de comprendre.
    Si tu as du code C sur lequel tu bloques, effectivement, nous pourrions t'aider. Le but de ce forum est d'apporter de l'aide, pas de résoudre les exercices. Il y a beaucoup de tutoriels sur internet pour cela.

    Sinon pour les chaînées tu dois déjà définir une structure de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct stListeChaine {
        // Définitions de tes données
        struct stListeChaine *suivant ;    // Pointeur sur la case mémoire suivante
    } ;
    Pour l'allocation mémoire il te faut utiliser les fonctions malloc() et free(). Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Allocation d'un tableau de 10 octets non-signés
    unsigned char *tableau = NULL ;   // Initialisation du pointeur
    // Allocation
    tableau = malloc(10*sizeof(unsigned char)) ;
    // Accès à la 5 ième case
    *(tableau+(5*sizeof(unsigned char)) = 10 ;
    printf("5ième case = %d\n", *(tableau+(5*sizeof(unsigned char))) ;
    // Libération de la mémoire allouée
    free(tableau) ;
    [Edit]
    Milles excuses pour ce code erroné et dangereux
    Il faut utiliser Merci diogene
    [/edit]

  3. #3
    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
    Cette écriture pour accéder aux éléments d'un tableau est extrèmement dangereuse et à proscrire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *(tableau+(5*sizeof(unsigned char)) = 10 ;
    printf("5ième case = %d\n", *(tableau+(5*sizeof(unsigned char))) ;
    En fait elle ne marche que parce que sizeof(unsigned char) vaut toujours 1. L'arithmétique des adresses tient déjà compte de la taille des objets pointés (donc en quelque sorte le sizeof est implicite).

    On doit écrire, (valable quel que soit le type de l'adresse tableau) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *(tableau+5) = 10 ;
    printf("5ième case = %d\n", *(tableau+5)) ;
    ou ce qui est équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tableau[5] = 10 ;
    printf("5ième case = %d\n",tableau[5]) ;

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 7
    Par défaut
    en réponse aux 5 premières questions :



    Question 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct {
            char nom [20] ;
            char tel [15] ;
            } tClient
     
    typedef struct tNoeud {
            tClient c ;
            struct tNoeud *suivant ;
            } tNoeud
     
     
    tNoeud **A;
    A=(tNoeud*)malloc(26*sizeof(tNoeud));

    Question 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void ajouter (tNoeud **A ,tClient c){
         toupper (num[0]-‘A’)=i1
         }
    Question 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tNoeud rechercher (tNoeud **A, char ch[20]){
           tNoeud temp=**A;
           while (temp!=null)
           if (temp-> tClient.nom[20]==ch[20]);
           return temp-> tClient.tel;
           else temp=temp-> suivant
           return null;
           }

    Question 4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    tNoeud supprimer (tNoeud **A, char ch[20]){
           tNoeud temp=**A;
           while (temp!=null)
           if (tmp-> tClient.nom[20]==ch[20]);
           tNoeud-> l;
           l-> suivant;
           free(s);
           return l;

    Question 5

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void supprimerTout(tNoeud **A)
    {
            tNoeud *temp;
            while(*A)
              {
                 temp = (*A)-> suivant;
                 free(*A);
                 *A = temp;
              }
    }
    qu'en pensez vous ?

  5. #5
    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
    Quelques remarques :

    Question 1
    a- D'accord pour la définition tClient
    b- C'est une option valable pour tNoeud
    c- C'est une option valable pour A, mais, comme on connait à priori le nombre d'éléments, on peut se passer de l'allocation dynamique. On peut formaliser cela (ce qui correspond à la question, je pense) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef tNoeud * TAnnuaire[26];
    // et instancier un annuaire par 
    TAnnuaire A = {NULL};
    Question 2
    Code insuffisant : n'ajoute rien à l'annuaire.
    a- Chercher dans quelle liste on doit ajouter le client. Si on suppose que 'A'...'Z' correspondent à des codes consécutifs ainsi que 'a'...'z' (comme en ASCII), alors l'indice i de la liste est effectivement i = toupper(c.num[0])-'A' (si c.num[0] est un caractère alphabétique cf isalpha())
    Comme il va être nécessaire de faire cette opération plusieurs fois dans le programme (aux questions 2, 3, 4 et 5), on a intérêt à faire une petite fonction qui retourne l'indice en fonction du nom. Son prototype pourrait être int indice(char* nom);.
    b- Maintenant il faut l'ajouter en tête de la liste A[i].

    Questions suivantes :
    Attention, on ne compare pas des chaines avec == mais avec la fonction strcmp()

Discussions similaires

  1. Exercice sur liste chainée
    Par manou756011 dans le forum C
    Réponses: 1
    Dernier message: 04/05/2014, 21h16
  2. Exercice liste chainée
    Par darkwall_37 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/12/2010, 04h44
  3. projet ou exercices sur les listes chainées
    Par petite_developpeuse dans le forum C
    Réponses: 1
    Dernier message: 12/12/2008, 17h07
  4. Recherche des exercices pour les listes chainée
    Par dot-_-net dans le forum C
    Réponses: 1
    Dernier message: 15/12/2007, 18h14
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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