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 Simple]_Sentinelle_


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut [Liste Chainée Simple]_Sentinelle_
    Salut,
    C'est une question concernant ce cours : http://nicolasj.developpez.com/articles/listesimple/
    vu que je débute en programmation, et que le concept des listes chainées est tout nouveau pour moi, je n'ai pas compris l'utilité de la sentinelle utilisée en début de chaine ... pourquoi ne pas faire pointer directement p_start sur le premier èlément ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 116
    Par défaut
    afin d'éviter une seg fault si ce lien vaut NULL ;-)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Salut,
    C'est une question concernant ce cours : http://nicolasj.developpez.com/articles/listesimple/
    vu que je débute en programmation, et que le concept des listes chainées est tout nouveau pour moi, je n'ai pas compris l'utilité de la sentinelle utilisée en début de chaine ... pourquoi ne pas faire pointer directement p_start sur le premier èlément ?

    Merci
    Parce que le concept de liste peut s'envisager même si elle ne contient pas (encore) d'élément. Dans ce cas, il faut bien mettre une valeur particulière à ce p_start pour indiquer justement que la liste est vide => d'où le NULL
    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]

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour moi, ça ne sert à rien, et on pourrait directement initialiser p_start à NULL pour une liste vide.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour moi, ça ne sert à rien, et on pourrait directement initialiser p_start à NULL pour une liste vide.
    Je pense que l'explication de l'utilité de la sentinelle est ici :
    III-I. Accès au premier élément de la liste
    Cette fonction est rendue extrêmement simple par l'existence de la sentinelle :
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ben pour moi, c'est encore plus simple sans: Le premier élément de la liste, c'est l'élément pointé par p_start...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par Trap D
    Je pense que l'explication de l'utilité de la sentinelle est ici :
    Citation:
    III-I. Accès au premier élément de la liste
    Cette fonction est rendue extrêmement simple par l'existence de la sentinelle :
    Oui je me disais aussi mais comme la dit "Médinoc" elle serais encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void sll_first (sll_s * p_sll)
    {
       if (p_sll)
       {
          p_sll->list = p_sll->p_start->next;
       }
    }
    Sera remplacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void sll_first (sll_s * p_sll)
    {
       if (p_sll)
       {
          p_sll->list = p_sll->p_start;
       }
    }
    Citation Envoyé par Sve@r
    Parce que le concept de liste peut s'envisager même si elle ne contient pas (encore) d'élément. Dans ce cas, il faut bien mettre une valeur particulière à ce p_start pour indiquer justement que la liste est vide => d'où le NULL
    Voilà je vous explique ce que j'ai compris et vous me dites si c'est juste :

    La fonction d'initialisation de la liste crée un premier noeud (Une sentinelle) qui pointe vers NULL, puis elle fait pointer p_start sur ce noeud (Une sentinelle), les éléments insérés viendrons après cette sentinelle, elle pointera donc toujours sur le premier noeud de la liste, Je me disais que ça c'était le boulot de p_start de pointer toujours sur le premier noeud de la liste ...

    Enfin il ya surement une subtilité qui se cache derrière tout ceci

    Merci

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    En fait, il y a autre chose que j'ai du mal à comprendre, c'est le fait de stocker un pointeur "nœud courant" dans la structure sll.
    Pour moi, c'est le genre de chose qui se met à l'extérieur.

    ...Par contre, on peut stocker un pointeur "dernier nœud"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Voilà je vous explique ce que j'ai compris et vous me dites si c'est juste :

    La fonction d'initialisation de la liste crée un premier noeud (Une sentinelle) qui pointe vers NULL, puis elle fait pointer p_start sur ce noeud (Une sentinelle), les éléments insérés viendrons après cette sentinelle, elle pointera donc toujours sur le premier noeud de la liste, Je me disais que ça c'était le boulot de p_start de pointer toujours sur le premier noeud de la liste ...

    Enfin il ya surement une subtilité qui se cache derrière tout ceci

    Merci
    C'est pas tout à fait exact.

    Dans la notion de liste telle que je la conçois (et comme ça semble être expliqué aussi dans le premier lien de ce topic), on distingue deux éléments
    1) le membre de la liste (un wagon quoi). Il contient son contenu et le pointeur sur le suivant. On peut avoir aussi un pointeur sur le précédent si on a besoin de faire des parcours dans les deux sens mais c'est facultatif
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct s_elem {
        int valeur;
        struct s_elem *next;
    } t_elem;
    2) l'objet qui tient la liste et c'est là que les avis divergent. Certains disent "tenir le premier wagon est amplement suffisant". Ce n'est pas faux. Le problème c'est que quand ce premier wagon change, comme on a en main un simple pointeur ben il faut que la fonction qui fait le changement modifie ce pointeur. Et toute fonction qui modifie un truc doit recevoir l'adresse de ce truc. Donc si elle modifie un pointeur elle doit travailler sur l'adresse de ce pointeur (l'adresse d'une adresse). C'est faisable. Exemple avec une fonction qui va modifier le premier élément d'une liste en le remplaçant par un nouvel élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void modif_first(t_elem **first, t_elem *new)
    {
        new->next=(*first);
        (*first)=new;
    }
    Devoir travailler sans cesse avec "*first" dans la fonction devient vite chiant. On peut se planter, etc. De plus, un autre problème se pose quand on veut manipuler "n" listes. Il faut tenir "n" premiers pointeurs. Et là le risque de s'embrouiller les pinceaux est encore plus grand.
    Un 3° problème se pose si on veut avoir des éléments subsidiaires de la liste comme son nb d'éléments. Il faut une seconde variable style "nb_elem". Mais maintenant qu'on doit gérer "n" listes faut gérer "n" premiers pointeurs PLUS "n" nb_elem. Lourd lourd.
    De plus, conceptuellement, quand une variable "x" est associée à une variable "y" (comme hh et mn) ben il est courant de les regrouper en structures.

    C'est là qu'arrive donc une seconde opinion => rajouter une structure qui manipule la liste. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef struct {
        t_elem *first;
    } t_liste;
    Ca semble tout con d'avoir une structure qui ne contient qu'un seul élément mais après, on s'aperçoit qu'on en ressort plein d'avantages dans la manipulation. Par exemple si je reprends la fonction qui modifie le premier élément de la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void modif_first(t_liste *liste, t_elem *new)
    {
        new->next=liste->first;
        liste->first=new;
    }
    On constate maintenant une plus grande simplicité dans l'écriture. Plus la peine de se palucher des "**" à tour de bras en bossant ensuite avec (*ceci)=truc.

    A partir de là, une fois qu'on a l'outil, on peut l'enrichir en y rajoutant le nb d'élements ou autres trucs perso qui aideront à la manipulation de la liste. On peut créer une fonction d'initialisation style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void initListe(t_liste *liste)
    {
        liste->first=NULL;
        liste->nb=0;
    }
    Et d'autres fonctions très basiques d'insertion ou autre. Une fois que tous les outils sont créés, il ne reste plus qu'à les utiliser pour une liste, style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        t_liste maListe;
        initListe(&maListe);
        <...>
    }
    Ou bien pour un gros paquet de listes, style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        t_liste monTableauDeListe[100];
        size_t i;
     
        for (i=0; i < 100; i++)
            initListe(&monTableauDeListe[i]);
        <...>
    }
    Bon, je sais que ça te semble un peu obscur. Quand tu auras un peu plus l'habitude, que tu auras travaillé, créé des algo, tu te rendras compte qu'avoir un objet (hoho, on parle d'objet ?) + des fonctions associés à chaque concept permet ensuite une plus grande simplicité dans la programmation.

    Citation Envoyé par medinoc Voir le message
    En fait, il y a autre chose que j'ai du mal à comprendre, c'est le fait de stocker un pointeur "nœud courant" dans la structure sll.
    Pour moi, c'est le genre de chose qui se met à l'extérieur.
    Ben justement, avec le type t_liste, t'as le choix. Ca peut être inclus dans la structure (toute fonction recevant la structure en paramètre saura où en est le courant) ou en dehors (pour un travail local). Alors que sans le type t_liste ben t'étais limité à une seule possibilité...
    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]

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

Discussions similaires

  1. Liste chainée simple
    Par boula dans le forum C
    Réponses: 9
    Dernier message: 23/05/2008, 22h32
  2. Liste chaine simple
    Par boula dans le forum C
    Réponses: 6
    Dernier message: 21/05/2008, 11h10
  3. Liste chainée simple
    Par BatuBou dans le forum C
    Réponses: 6
    Dernier message: 21/01/2008, 11h35
  4. liste chaine simple
    Par el baz dans le forum C
    Réponses: 8
    Dernier message: 03/08/2007, 20h54
  5. un probléme de liste chainé simple
    Par seifdev dans le forum C
    Réponses: 15
    Dernier message: 02/04/2007, 16h36

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