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 :

Ajout élément par ordre alphabétique dans une liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Par défaut Ajout élément par ordre alphabétique dans une liste chainée
    Bonjour,
    J'ai créé une structure étudiant afin de l'utiliser dans une liste chainée pour gérer une école et différente section.
    Ma fonction pour ajouter un étudiant par ordre alphabétique fonctionne quand il y a déjà des élément dans ma liste, par contre mon programme plante quand mon élément est le premier à devoir être inséré dans ma liste.
    J'ai passé la journée dessus et je bloque...

    Peut-être qu'un regard neuf et expert trouvera mon erreur?

    C'est ma fonction: Etudiant * ajoutAlpha(Etudiant * tete,char inom[]);
    qui ne fonctionne pas totalement, les autres fonctionnent.

    ma structure (enum.h)
    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
     
    #ifndef ENUM_H
    #define ENUM_H
     
    typedef struct Etudiant Etudiant;
    struct Etudiant
    {
        char nom[25];
        Etudiant * next;//pointeur vers la structure Etudiant suivante
    };
     
    //creation de maillon
    Etudiant * creationMaillon(char nom[]);
     
    //insertion en tête
    Etudiant * insertionTete(Etudiant * tete, Etudiant * elt);
     
    //lire liste
    void lireList(Etudiant * tete);
     
    //libère mémoire
    void freeList(Etudiant * tete);
     
    //insertion dans l'ordre alphabétique
    Etudiant * ajoutAlpha(Etudiant * tete,char inom[]);
     
    #endif // ENUM_H
    mes fonctions (Fct.c)
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "enum.h"
     
    //creation de maillon et hardcodage du nom
    Etudiant * creationMaillon(char nom[])
    {
        Etudiant *maillon = NULL;
        maillon = malloc(sizeof(Etudiant));
        if (maillon == NULL)
            {
                printf("Mémoire insuffisante");
                exit(99);
            }
            sprintf(maillon->nom, nom);
            maillon->next = NULL;
        return maillon;
    }
     
    //insertion en tête
    Etudiant * insertionTete(Etudiant * tete, Etudiant * elt)
    {
         if (tete == NULL)
            {
                tete = elt;
            }
            else
            {
                elt->next = tete;
                tete = elt;
            }
        return tete;
    }
     
    //lire liste
    void lireList(Etudiant * tete)
    {
        while (tete != NULL){
                printf("%s\n", tete->nom);
                tete = tete->next;
            }
            printf("---------------\n");
    }
     
    //libère la mémoire
    void freeList(Etudiant * tete)
        {
            Etudiant * temp = NULL;
            while (tete != NULL)
            {
                temp = tete;
                tete = tete->next;
                printf("free(%s)\n", temp->nom);
                free(temp);
            }
            printf("---------------\n");
        }
     
    //insertion dans l'ordre alphabétique
    Etudiant * ajoutAlpha(Etudiant * tete,char inom[])
    {
        Etudiant *temp = tete;
        Etudiant *elt = NULL;
        elt = malloc(sizeof(Etudiant));
        if (elt == NULL)//test si allocation a fonctionné
            {
                printf("Mémoire insuffisante");
                exit(99);
            }
        strcpy(elt->nom,inom);
        if (temp == NULL) // si la liste est vide on renvoie elt
            return elt;
        else if( strcmp(temp->nom,inom) > 0 ) // si l'élément est a insérer en premier
        {
            elt->next=tete;
            return elt;
        }
        else // si l'élément est a insérer au milieu ou a la fin
        {
            while ( temp->next != NULL && strcmp(temp->next->nom,inom) < 0 )  // on trouve l'endroit
            {
               temp = temp->next;
            }
            elt->next = temp->next;
            temp->next = elt;
        }
        return tete;
    }
    Et mon main.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "enum.h"
     
     
     
    int main()
    {
        Etudiant *teteListe = NULL, *maillon = NULL;
     
        teteListe = ajoutAlpha(teteListe,"Fred");
     
        //maillon = creationMaillon("Fred");
     
        //teteListe = insertionTete(teteListe, maillon);
     
        lireList(teteListe);
     
        teteListe = ajoutAlpha(teteListe,"Zoe");
     
        lireList(teteListe);
     
        freeList(teteListe);
     
        return 0;
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Quand on passe d'une liste vide à une liste à un unique élément, le champ elt->next n'est pas initialisé, il faut le mettre à NULL.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Quand on passe d'une liste vide à une liste à un unique élément, le champ elt->next n'est pas initialisé, il faut le mettre à NULL.
    Je vais passer pour un boulet...
    Je comprends le principe, mais je ne vois pas où le mettre?
    Avant le return elt;

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Cisman Voir le message
    Je comprends le principe, mais je ne vois pas où le mettre?
    Avant le return elt;
    Bonjour

    C'est quand tu crées ton maillon que tu remplis tous ses champs (donc y compris le next).
    Ensuite, tu places ton maillon dans la liste donc là le next peut changer... ou pas.

    Le problème, c'est que tu as une fonction "creationMaillon" qui crée le maillon, et une autre "ajouterAlpha" qui, elle aussi, crée un maillon. C'est pas bon. Tu ne dois avoir qu'une seule fonction qui effectue une seule tâche, et ensuite tu appelles les fonctions adéquates.
    Donc avec une fonction "creationMaillon", et une autre "insertionMaillon" ça doit suffire.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour



    Le problème, c'est que tu as une fonction "creationMaillon" qui crée le maillon, et une autre "ajouterAlpha" qui, elle aussi, crée un maillon. C'est pas bon. Tu ne dois avoir qu'une seule fonction qui effectue une seule tâche, et ensuite tu appelles les fonctions adéquates.
    J'avais fait la Fct crationMaillon avant. Mon but c'est de n'utiliser que la fonction ajouterAlpha(), pour créer et insérer directement au bon endroit. C'est là que je bloque quand je dois mettre mon maillon en premier dans la liste.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2017
    Messages : 176
    Par défaut
    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
     
    Etudiant * ajoutAlpha(Etudiant * tete,char inom[])
    {
        Etudiant *temp = tete;
        Etudiant *elt = NULL;
        elt = malloc(sizeof(Etudiant));
        if (elt == NULL)//test si allocation a fonctionné
            {
                printf("Mémoire insuffisante");
                exit(99);
            }
        strcpy(elt->nom,inom);
        if (temp == NULL) // si la liste est vide on renvoie elt
        {
            elt->next = NULL;
            return elt;
        }
     
        else if( stricmp(temp->nom,inom) > 0 ) // si l'élément est a insérer en premier
        {
            elt->next=tete;
            return elt;
        }
        else // si l'élément est a insérer au milieu ou a la fin
        {
            while ( temp->next != NULL && stricmp(temp->next->nom,inom) < 0 )  // on trouve l'endroit
            {
               temp = temp->next;
            }
            elt->next = temp->next;
            temp->next = elt;
        }
        return tete;
    }
    Trouvé et je fait srticmp plutôt que strcmp. ça règle le problème majuscule minuscule.
    Bon maintenant, je m'attaque à un tri pour pouvoir afficher mes étudiants par ordre de résultats.

    Merci pour le coup de main.

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

Discussions similaires

  1. [AC-2013] Ordre alphabétique dans une liste déroulante
    Par maringot dans le forum IHM
    Réponses: 18
    Dernier message: 12/10/2017, 08h51
  2. [DATA] Classer les variables par ordre alphabétique dans une table
    Par alers dans le forum SAS Base
    Réponses: 5
    Dernier message: 11/03/2015, 14h40
  3. [AC-2007] Ordre alphabétique dans une requête qui calcule les E/S par mois
    Par Kisty10 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 07/05/2011, 18h47
  4. Tie par ordre alphabétique d'une liste
    Par Freygolow dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 18/05/2007, 00h00
  5. Ordre alphabétique dans une liste déroulante
    Par Z[ee]k dans le forum Access
    Réponses: 2
    Dernier message: 30/05/2006, 15h02

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