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 :

Question sur adresse d'une liste chainée


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Question sur adresse d'une liste chainée
    Bonjour à tous,

    Je débute l'apprentissage du C et jusqu' ici tout ce passe bien mais je bloque sur une fonction de recherche d'élément dans une liste chaînée.

    La fonction de mon cours est défini comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    P_un_element rechercher_un element(P_un_element pliste, char *mot)
        {
         while(pliste)
                   {
                    if (strcmp(pliste->mot, mot) == 0) return pliste;
                    pliste = pliste->suivant;
                    }
         return NULL;
         }
    en ayant défini au préalable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _un_element *P_un_element
    typedef struct _un_element
               {
               char mot[30];
               P_un_element suivant;
               } Un_element;
    Habituellement dans les autres exemples de fonction manipulant des listes chaînées j'ai pu voir qu'on créait un pointeur temporaire sur la liste et c'est l'adresse de celui-ci qu'on modifiait pendant les boucles et autres, par exemple dans l'exemple de ma focntion on aurait défini:
    P_un_element temp = pliste

    Ce que je n'arrive pas à comprendre c'est qu'ici on boucle directement sur pliste qui est à priori l'adresse du premier élément de notre liste.
    A l'issue de la ponction pliste pointe donc sur l'élément recherché non?

    Mais alors qu'est-ce qui pointe sur le début de la liste du coup? Si je veux reparcourir ma liste pour une raison ou une autre par quoi j'appel cette liste vu que *pliste ne pointe à priori plus sur le début de la liste mais un élément bien particulier de celle-ci.

    Dans mon cours il y a bien une explication mais que je n'arrive pas à comprendre:
    "Cette fonction modifie l'argument pliste, qui contient l'adresse du début de la liste. Cette variable contient une copie de cette adresse, la modifier est donc sans conséquence sur la liste initiale. ATTENTION si *pliste avait été modifié (ou un champ de pliste en utilisant l'écriture '->') cela aurait modifié la liste chaînée."

    Donc certe la liste n'est pas modifié mais où est l'adresse du premier élément? Quelle est cette "copie" de l'adresse évoqué dans l'explication, et surtout ou la retrouvé??

    Je suis sûr que la réponse est toute simple et que c'est moi qui doit avoir mal compris un concept dans les pointeurs ou les structures mais après quelque recherche je n'arrive vraiment pas à comprendre^^

    Merci de votre aide!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Non , à chaque tour de boucle pliste est modifié avec le suivant.

    Mais comme le passage de paramètres est par valeur , aucune modification n'est prise en compte au retour de la fonction.

    Test ceci:

    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
    void test1(int a) {
        a = 55;
    }
     
    void test2(int* a) {
       (*a) = 55; // test NULL
    }
     
    int main(/* arg */) {
        int a = 10;
     
        test1(a);
     
        printf("Test1: %d\n", a);
     
        test2(&a);
     
        printf("Test2: %d\n", a);
     
        return 1;
    }

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Aaaaaah j'ai compris! Effectivement c'était tout simple!!
    Merci beaucoup foetus!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/10/2011, 14h30
  2. Tri sur une liste chainée
    Par Leclandestin dans le forum C++
    Réponses: 5
    Dernier message: 21/03/2011, 18h22
  3. Tri par insertion sur une liste chainé simple.
    Par loula427 dans le forum Débuter
    Réponses: 6
    Dernier message: 21/03/2011, 14h54
  4. Réponses: 8
    Dernier message: 03/12/2006, 17h46

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