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 triée sans insertion de doublon


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 20
    Points : 24
    Points
    24
    Par défaut Liste chainée triée sans insertion de doublon
    Bonjour,

    Je souhaite créer une liste chaînée triée, qui lors de l'insertion d'un nouvel élément vérifie si il est déjà présent et ne l'insère pas dans ce cas.

    Ayant du mal à comprendre les listes chaînée j'ai trouvé un tutoriel sur le site me permettant d'insérer des éléments dans une liste chaînée en les triant.
    Mais j'obtiens des doublons.
    Voici mon code pour l'insertion :
    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
    void insert(LISTE_DOC **sl, int Val)
    {
            LISTE_DOC *tmp = NULL;
            LISTE_DOC *csl = *sl;
            LISTE_DOC *elem = malloc(sizeof(LISTE_DOC));
            if(!elem) exit(1);
            elem->numeroDoc = Val;
            while(csl && csl->numeroDoc < Val)
            {
                 tmp = csl;
                 csl = csl->suiv;
            }
            elem->suiv = csl;
            if(tmp) tmp->suiv = elem;
            else *sl = elem;
    }
    Je ne comprends pas bien les 3 dernières étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    elem->suiv = csl;
    if(tmp) tmp->suiv = elem;
    else *sl = elem;
    J'ai testé en mettant une condition mais ça ne fonctionne pas.

    Pourriez-vous m'aider à comprendre et résoudre ce problème ?

    Par avance je vous remercie

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Il faut changer un peu l'ordre des opérations effectuées par ce code pour l'adapter à ton cas. Ce code fait :

    1- Création d'un nouvel élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            LISTE_DOC *elem = malloc(sizeof(LISTE_DOC));
            if(!elem) exit(1);
            elem->numeroDoc = Val;
    2- Recherche du point d'insertion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            while(csl && csl->numeroDoc < Val)
            {
                 tmp = csl;
                 csl = csl->suiv;
            }
    3- Insertion dans la liste (derrière l'élément tmp si il existe et avant l'élément csl si il existe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            elem->suiv = csl;
            if(tmp) tmp->suiv = elem;
            else *sl = elem; // ceci pour le cas où on insère en tête de liste
    Il faudrait faire :

    1- Recherche du point d'insertion tmp.
    A ajouter : Si alors tmp est != NULL et à la même valeur que celle que l'on veux insérer, ne rien faire et sortir

    2- Sinon, créer un nouvel élément

    3- et l'insérer dans la liste
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Insertion d'un élément dans une liste simplement chainée triée (croissante)
    Par vayouva dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 14/11/2014, 09h29
  2. Réponses: 4
    Dernier message: 16/12/2012, 19h15
  3. [XL-2000] Liste Triée sans doublon
    Par cobra38 dans le forum Excel
    Réponses: 4
    Dernier message: 07/07/2010, 23h13
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05

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