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 :

Qu'es ce qui ne va pas avec cette liste chainée ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut Qu'es ce qui ne va pas avec cette liste chainée ?
    Bonjour !
    j'essaie de faire une simple liste chainée, mais apparament il y a un probleme lors du passage du pointeur d'element dans la fonction addBegin.

    Je ne comprend pas, car je l ai deja fait avec des entiers... mais le pElem de la fonction main reste a NULL.

    le code :

    linkedList.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
     
    #ifndef LINKEDLIST_H
    #define LINKEDLIST_H
     
    #include <stdio.h>
    #include <stdlib.h>
     
     
    typedef struct{
        int value;
        struct element *next;
    }element;
     
    void addBegin(element *pElem, int value);
    void view(element *pElem);
     
    #endif
    linkedList.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
    #include "linkedList.h"
     
    void addBegin(element *pElem, int value)
    {
        element *pE;                            /* Declarer un nouvel element */
        pE = malloc(sizeof(element));           /* Allocation memoire pour cet element */
        pE->value = value;                      /* Attribution de la valeur */
        pE->next = pElem;                       /* L' element suivant est maintenant pElem, puisque pE est le premier element*/
        pElem = pE;                             /* Le premier element prend l'@ du nouvel element*/
    }
     
    void view(element *pElem)
    {
        while(pElem != NULL)
        {
            printf("%d\n", pElem->value);
            pElem = pElem->next;
        }
    }
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
    #include <stdlib.h>
     
    #include "linkedList.h"
     
    inline int askValue()
    {
            int value;
            printf("Value : ");
            scanf("%d", &value);
            return value;
    }
     
    int main()
    {
        int choice;
        int value;
        element *pElem = NULL;      /*Premier element de la liste*/
     
        do{
            printf("1:addBegin\n2:addEnd\n3:addSort\n4:view\n5:quit\nYour choice : ");
            scanf("%d", &choice);
            switch(choice)
            {
                case 1:
                    value = askValue();
                    addBegin(pElem, value);
                    printf("\n-- The value %d has been add to the begin of the list --\n\n", value);
                    break;
                case 2:
                    //...;
                    break;
                case 3:
                    //...
                    break;
                case 4:
                    view(pElem);
                    break;
            }
        }while(choice != 5);
     
        return 0;
    }
    J'ai regardé ce tuto :
    http://chgi.developpez.com/pile/

    Mais je prefere passer juste un pointeur au lieu d'un pointeur de pointeur... si cella est possible.

    D'après moi, la ligne qui pose problème serai dans la fonction addBegin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        pElem = pE;                             /* Le premier element prend l'@ du nouvel element*/
    Cette instruction ne remplirai pas son rôle, puisque pElem rest a NULL dans main()... pourtant c'est un pointeur !

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    N'oublie pas que le C passe les paramétres par valeur. Cela vaut aussi pour les pointeurs.

    Dans la fonction addBegin(), si tu fais :
    la variable pElem déclarée dans main() n'est pas modifiée car c'est une copie de ce pointeur qui est passé à la fonction addBegin()

    Donc :
    • soit tu passes l'adresse de pElem à addBegin() qui dans ce cas doit attendre un element **
    • soit addBegin() retourne un element * que tu réutilises dans le main()...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    Ok, merci ! ca marche avec ces solutions !
    Pour être sur d'avoir bien compris la subtilité :

    Si je modifie la valeur pointé d'un pointeur, je passe un simple pointeur à ma fonction.

    Si je modifie l'adresse où est stocké le pointeur, alors ma fonction attend un pointeur de pointeur, que je passe avec & lors de l'appelle.

    Les joies du C !

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    pour faire simple, c'est bien ca !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Ou bien, si les pointeurs de pointeurs te font peur, tu peux utiliser une seconde structure:
    Code C : 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
    #ifndef H_LINKEDLIST_20080128_0955
    #define H_LINKEDLIST_20080128_0955
     
    struct element {
        int value;
        struct element *pNext;
    } s_element;
     
    struct liste {
        struct element *pFirst;
    } s_liste;
     
    void addBegin(s_liste *pListe, int value);
    void view(s_liste const *pcListe);
     
    #endif
    Code C : 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
    #include "linkedList.h"
    #include <stdlib.h>
    #include <stdio.h>
     
    void addBegin(s_liste *pListe, int value)
    {
        s_element *pE;                 /* Declarer un nouvel element */
        pE = malloc(sizeof(*pE));      /* Allocation memoire pour cet element */
        if(pE != NULL)
        {
            pE->value = value;         /* Attribution de la valeur */
            pE->next = pListe->pFirst;               
            pListe->pFirst = pE;       /* Le premier element prend l'@ du nouvel element*/
        }
    }
     
    void view(s_liste const *pcListe)
    {
        s_element const *pcElem = pcListe->pFirst;
        while(pcElem != NULL)
        {
            printf("%d\n", pcElem->value);
            pcElem = pcElem->next;
        }
    }
    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.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/04/2015, 00h38
  2. Réponses: 3
    Dernier message: 25/04/2012, 10h48
  3. qu'est ce qui ne va pas avec cette procédure ?
    Par Jcpan dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 19/01/2009, 09h39
  4. Réponses: 10
    Dernier message: 13/03/2007, 11h38
  5. qu'est ce qui ne va pas avec cette requête
    Par fk04 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/08/2006, 09h01

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