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 listes chaînées


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Fonctions listes chaînées
    Suite au tuto dispo ici

    http://chgi.developpez.com/pile/

    j'ai decidé de continuer et de faire de nouvelles fonctions
    Dont une qui supprime un element qui possede une valeur determiée d'une pile alors que la fonction de suppression disponible sur le tuto ne permettait que de supprimer celui sur le debut.

    Je voudrais avoir votre avis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pile* renvoie_nieme_element(pile *Mapile,int n){ 
        for(int i=2;i<=n;i++){
            Mapile=Mapile->prec;
        }
    return Mapile;
    }
    Ca permet de renvoie l'element qui se trouve a la nieme place.

    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
     
    pile* supr_un_element(pile** Mapile,int a){
    //supprime lelement qui possede la valeur a. 
     pile* temp=*Mapile; 
      pile* element_avant_le_supprimé;
     pile* element_apres_le_supprimé;
      pile* element_a_supprimer;
     int n=0; //n est le numéro de la place de l'élément qui précède celui qu'on doit supprimer.   
           if(temp!=0){
            while(temp->val!=a){
             temp=(temp)->prec;
     
             n=n+1;
        }
            element_avant_le_supprimé=renvoie_nieme_element(*Mapile,n);
            element_a_supprimer=renvoie_nieme_element(*Mapile,n+1);
            element_avant_le_supprimé->prec=element_a_supprimer->prec;
     
     
         } 
    return temp2;
    }
    Il y certainement mieux a faire, mais c'est ce que j'ai fait
    J'attends tous vos commentaires.


    et voici une fonction qui renvoie le min
    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 renvoie_min(pile* mapile){;
    int a;
     
    a=(*mapile).val;
    for (int i=1;i<=lentgh(mapile);i++){
        mapile=mapile->prec;
        //cout<<(*mapile).val<<endl; 
         if (a>=(*mapile).val){
     
         a=mapile->val;
         }
    }
    return a;
    }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    il faut que t'ailles dans le forum C je pense

  3. #3
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Je sais pas, moi a mon niveau je fais pas la diference,
    mais si vous le dites.

    Pour moi, le programme a ete ecrit en C ou en C++. Je fais pas de diff.

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voilà comment je ferais (non testé):

    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
     
    #include <stdlib.h>
    #include <assert.h>
     
    int supr_un_element(pile **Mapile, int valeur)
    {
        /* code d'erreur retourne par la fonction.  0 signifie pas d'erreur. */
        int err = 0;
     
        if (Mapile != NULL)
        {
            if (*Mapile != NULL) /* La pile n'est pas vide */
            {
                pile *p = *Mapile;
                pile *tmp = p;
     
                while (p != NULL && p->valeur != valeur)
                {
                    tmp = p;
                    p = p->prec;
                }
                if (p != NULL) /* L'element a ete trouve */
                {
                    assert(p->valeur == valeur);
     
                    if (tmp != p) /* L'element a effacer n'est pas le 1er element */
                    {
                        tmp->prec = p->prec;
                        free(p), p = NULL;
                    }
                    else /* L'element a effacer est le 1er element */
                    {
                        *Mapile = p->prec;
                        free(p), p = NULL, tmp = NULL;  
                    }
                }
                else
                {
                    /* L'element n'a pas ete trouve */
                    err = 3;
                }
            }
            else
            {
                /* Erreur: on ne fait rien, la pile est vide */
                err = 2;
            }
        }
        else
        {
            /* Erreur: argument invalide. */
            err = 1;
        }
     
        return err;
    }
    Pose des questions si tu ne comprends pas. Par ailleurs, n'oublie pas que ce n'est pas portable d'utiliser des caractères accentués pour tes identificateurs de variables.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    et comment ferais-tu pour supprimer le tout premier element?

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par deubelte Voir le message
    et comment ferais-tu pour supprimer le tout premier element?
    Oups, j'ai fait les choses un peu vite. Effectivement, je ne traite pas correctement le cas ou valeur correspond au premier élément de la pile. J'ai corrigé mon code dans ce sens et je l'ai validé. Tout semble OK! Toutefois, je verrais plus l'utilité d'une fonction comme supr_un_element() dans un type abstrait de donnée liste chainée. Avec une pile (comme c'est le cas ici), il n'y a pas vraiment de sens d'effacer un élément autre que celui qui se trouve au sommet. Dans ce cas, la fonction Pop() décrite dans le tuto de CGi est tout ce dont tu as besoin.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    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
    Mon avis sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    pile* renvoie_nieme_element(pile *Mapile,int n){ 
        for(int i=2;i<=n;i++){
            Mapile=Mapile->prec;
        }
    return Mapile;
    }
    Tu ne testes jamais si Mapile->prec est NULL, donc plante potentielle !
    "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

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    En fait, ce que je veux faire,cest une fonction de tri.
    je veux trier la pile
    je pense a un algo bourrin:
    Supposons la pile: 92369472
    On prend la pile par le debut
    On regarde ou se trouve le min
    on prend le min, on creer une nouvelle pile qui commence par cet element
    et on supprime l'element de la pile
    Ensuite, on recommence avec la pile une fois l'element supprimé.


    Bourrin je pense.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2012, 00h26
  2. fonctions des listes chaînées, et problème avec le main
    Par bounadalvidal dans le forum Débuter
    Réponses: 2
    Dernier message: 25/09/2010, 18h04
  3. Réponses: 3
    Dernier message: 23/09/2010, 17h05
  4. fonction d'ajout dans une liste chaînée
    Par bounadalvidal dans le forum Débuter
    Réponses: 8
    Dernier message: 22/09/2010, 18h42

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