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 :

Précision sur les listes chaînées


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Précision sur les listes chaînées
    Bonsoir,

    j'aimerais quelques précisions sur les listes chaînées :

    D'après ce que j'ai compris du sujet (corrigez moi si je me trompe!), une liste liste chaînée est composée de n structures contenant une partie données (entier,chaîne de caractères, structure, etc)et d'un pointeur pointant vers l'élément suivant (avec cas particulier pour premier et dernier éléments).

    L'avantage d'une liste chaînée est donc de pouvoir insérer et créer autant d'éléments que l'on souhaite, sans savoir à l'origine combien il y en aura ( car si l'on sait combien on aura d'éléments, autant créer un tableau c'est bien plus simple non ?).

    Mais au début du programme, il faut bien déclarer chaque les éléments ? Alors comment est-ce possible vu que l'on n'en connait pas a priori le nombre ?

    C'estpour cela qu'il me semble que l'on ne déclare que 3 structures,

    où la strucure en question est par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct noeud{
     
    char info;
    struct noeud *next;
     
    }node;

    node *tete,p*,q*;
    (tete est le premier element dela liste)
    et p et q sont utilisés lors d'opérations telles que insérer, déplacer, supprimer(etc.) un élément et modifient les pointeurs sur la structure pour indiquer le nouveau chemin vers l'élément suivant.

    Donc je pense qu'on ne connait pas explicitement l'adresse du i-ème élément, mais qu'on y accède à partir de l'adresse du premier élément.

    Mais alors comment acceder concrètement à cet i-ème élément en pratique ?
    Par exemple pour afficher à l'écran le contenu de sa partie information ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En utilisant une boucle.
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Tu entends quoi par utiliser une boucle ?

    pour un tableau aucun soucis, on accède à l'élément i par tab[i] puisque tous les éléments sont stockés de façon contigüe.

    mais pour une liste chaînée je vois pas comment une boucle permet de faire ça.
    Ou plutôt, je ne vos pas sur quoi doit agir cette boucle...

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Von22 Voir le message
    Tu entends quoi par utiliser une boucle ?

    pour un tableau aucun soucis, on accède à l'élément i par tab[i] puisque tous les éléments sont stockés de façon contigüe.

    mais pour une liste chaînée je vois pas comment une boucle permet de faire ça.
    Ou plutôt, je ne vos pas sur quoi doit agir cette boucle...
    Ben tu récupères un pointeur "p" qui pointe donc sur un élément de la liste (le premier ou un autre ça n'a pas d'importance)
    1) tu affiches le contenu de cet élément
    2) tu regardes si "p->next" n'est pas nul et si c'est le cas tu affectes "p->next" à "p" et tu retournes en "1" => c'est la boucle (bien entendu quand tu crées un nouvel élément pour ta liste tu mets "NULL" dans le membre "next" de ce nouvel élément quitte à le modifier ensuite lorsque cet élément sera inséré au milieu des autres ; comme ça tu es certain que le dernier élément de ta liste aura bien ce "NULL" que tu cherches en "2")

    Petit détail: on n'utilise une liste chaînée que si on a besoin d'insérer des éléments au milieu (par exemple parce qu'ils sont dans un certain ordre qu'on désire conserver). Si on n'a pas besoin de cette possibilité, alors vaut mieux utiliser un tableau dynamique (alloué puis réalloué quand on a besoin de l'agrandir)

    Autre détail => il peut être utile aussi de créer une structure pour y ranger "tete", "p" et "q". Cela permet d'y mettre d'autres infos utiles (comme par exemple le nombre d'éléments, l'adresse du dernier, etc...). Ensuite, chaque fonction qui a besoin de manipuler la liste reçoit un pointeur sur cette structure et grace à ce pointeur ladite fonction peut accéder à toutes les infos et tous les outils de la liste...
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ah au temps pour moi.

    Est ce quelque chose de ce genre conviendrait pour insérer un élément?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    p=(node)*malloc(sizeof(node));
    p->info=... ;
    q=tete;
    while(q->info!=...){
     
    q=q->next;
     
    }
    p->next=q->next;
    q->next=p;
    ...

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Von22 Voir le message
    Ah au temps pour moi.

    Est ce quelque chose de ce genre conviendrait pour insérer un élément?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    p=(node*)malloc(sizeof(node));
    p->info=... ;
    q=tete;
    while(q->info!=...){
    
    q=q->next;
    
    }
    p->next=q->next;
    q->next=p;
    ...
    Exactement ça. T'as fait une erreur sur le cast qui est d'ailleurs inutile mais sinon c'est bon. Ensuite on préfère découper cet algo en deux fonctions
    1) fonction de création (qui alloue et remplit le contenu)
    2) fonction d'insertion (qui se charge d'insérer là où il faut)
    Ca rend les choses plus modulaires (les règles d'insertion peuvent changer par exemple...)
    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]

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    ok ok.
    En tout cas merci beaucoup!

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 984
    Points
    30 984
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Von22 Voir le message
    ok ok.
    En tout cas merci beaucoup!
    Gaffe quand-même à ton "while(q->info != ...)". Si la condition n'est jamais trouvée, tu balayes toute ta liste, ton pointeur "q" finit par recevoir "NULL" (fin de la liste") et tu vas taper dans "q->info" => Plantation de bug !!!

    Si t'es sûr que la condition est trouvée ça va, sinon vaut mieux y rajouter un test sur q->next => "while (q->info != ... && q->next != 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]

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

Discussions similaires

  1. Tutoriel sur les listes chaînées : votre avis ?
    Par EpiTouille dans le forum Pascal
    Réponses: 5
    Dernier message: 10/05/2013, 16h17
  2. petit problème sur les listes chaînées
    Par poche dans le forum C
    Réponses: 14
    Dernier message: 19/03/2007, 16h53
  3. Précisions sur les listes
    Par Virgile59 dans le forum Access
    Réponses: 1
    Dernier message: 07/02/2006, 21h20
  4. Précisions sur les recordset DAO
    Par Igricheff dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2005, 17h16
  5. Précision sur les sauvegarde à chaud
    Par alxkid dans le forum Administration
    Réponses: 2
    Dernier message: 09/08/2004, 18h55

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