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 :

fonctions des listes chaînées, et problème avec le main


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Points : 40
    Points
    40
    Par défaut fonctions des listes chaînées, et problème avec le main
    Bonjours tous,

    Alors ça fait deux jours que je sèche sur quelques points, je me suis dit qu'il est temps de demander de l'aide.

    D'abord le code des fonctions :

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    //-------------------------------------------
    ///définir la structure
    //-------------------------------------------
       typedef struct pile
            {
                    int valeur;
                    struct pile *prec;
            } pile ;
     
    //-------------------------------------------
    /// intitialiser la pile à NULL
    //-------------------------------------------
     pile *MaPile = NULL;
     
     
     //------------------------------------------
    ///fonction d'ajout dans la liste chaînée
    //-------------------------------------------
    pile * add(pile ** p,int val) {
            pile * n=malloc(sizeof(pile));
            n->prec= *p;
            *p=n;
            n->valeur= val;
            return *p;}
     
    //--------------------------------------------
    ///fonction de parcours dans une liste chaînée
    //--------------------------------------------
     
    void parcours(pile **p){
            do
            {
                int val= (*p)->valeur;
                printf("%d\n",val);
                *p=(*p)->prec;
                }while(*p);
    }
     
    //----------------------------------------------
    ///fonction de suppression dans une listee chaînée
    //----------------------------------------------
    void efface(pile **p){
            pile * n= *p;
            *p=(*p)->prec;
     
            //free(*p);
     
    }
    //----------------------------------------------
    ///fonction de recherche dans une liste chaînée
    //----------------------------------------------
     
    void search(pile **p, int val){
            int b=0;
            while(*p != NULL)
            {
                if((*p)->valeur==val)
                      {
                            b=1;
                      }
            *p=(*p)->prec;
     
            }
            if(b==1) printf(" it's 1");
            if(b==0) printf("it's 0");
     
    }
    alors pour vérifier le bon fonctionnement de ces fonctions, j'ai fait plusieurs versions du "main":

    1/
    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
     
    int main()
    {
     
        add(&MaPile, 1);
        add(&MaPile, 2);
        add(&MaPile, 3);
        //efface(&MaPile);
        printf("-----------\n");
        parcours(&MaPile);
        printf("-----------\n");
     
     
        return 0;
    }
    Qui marche à merveille, l'ajout se fait, le parcours aussi, l'affichage le prouve.

    2/
    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
     
    int main()
    {
     
        add(&MaPile, 1);
        add(&MaPile, 2);
        add(&MaPile, 3);
        efface(&MaPile);
        printf("-----------\n");
        parcours(&MaPile);
        printf("-----------\n");
     
     
     
        return 0;
    }
    Un élément saute, la fonction effacer marche alors ! Super !

    3/

    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
    int main()
    {
     
        add(&MaPile, 1);
        add(&MaPile, 2);
        add(&MaPile, 3);
        //efface(&MaPile);
        printf("-----------\n");
        parcours(&MaPile);
        printf("-----------\n");
        search(&MaPile,1);
     
     
        return 0;
    }
    Search ne marche pas, elle retourne 0, si d'ailleurs j'aurais initialiser b=5, elle aurait retourné 5, le teste ne se fait donc pas, ce que je ne comprends pas...

    4/
    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
     
    int main()
    {
     
        add(&MaPile, 1);
        add(&MaPile, 2);
        add(&MaPile, 3);
        printf("-----------\n");
        parcours(&MaPile);
        printf("-----------\n");
        efface(&MaPile);
        printf("\n-----------\n");
        parcours(&MaPile);
     
     
     
        return 0;
    }
    Là je compte parcourir la liste (le programme affichera alors 3,2,1), effacer un élément (qui sera 3) et reparcourir (ce qui devrait afficher 2.1), mais à ma grande surprise l'exe coïnce et me renvoie un message erreur : "pile.exe a cessé de fonctionner" !!

    Je précise que j'utilise Code::blocks, version 10.05.

    En attendant vos suggestions et réponses, merci de lire !

  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 y a des erreurs de principes : les fonctions parcours() et search() détruisent la pile !
    Par exemple, pour parcours(), on devrait avoir quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void parcours(pile **p)
    {
       pile * pp = *p;
       while(pp!= NULL)
       {
           printf("%d\n",pp->valeur);
           pp=pp->prec;
       }
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 63
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par diogene Voir le message
    Il y a des erreurs de principes : les fonctions parcours() et search() détruisent la pile !
    Par exemple, pour parcours(), on devrait avoir quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void parcours(pile **p)
    {
       pile * pp = *p;
       while(pp!= NULL)
       {
           printf("%d\n",pp->valeur);
           pp=pp->prec;
       }
    }
    Je vois, la ligne : détruit progressivement la liste, d'où la nécessité de créer un pointeur qui fasse le parcours (ça serait alors une réplique sur la liste qu'on détruit ! ). De même avec la fonction rechercher (search) !! Bon merci pour l'aide diogène

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

Discussions similaires

  1. Des problème avec le main.
    Par periambre dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 02/06/2009, 10h23
  2. Réponses: 0
    Dernier message: 09/03/2009, 19h01
  3. Réponses: 6
    Dernier message: 14/02/2008, 13h16
  4. Trier des listes chaînées
    Par colocolo dans le forum C
    Réponses: 2
    Dernier message: 16/02/2007, 17h40
  5. Liste déroulante chainée : problème avec value
    Par jpascal dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/08/2005, 21h06

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