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

  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.

  9. #9
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Le plus rapide cest le heapsort:

    http://en.wikipedia.org/wiki/Heapsort

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    a quoi ca sert "assert"?

  11. #11
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    A quoi ç'assert?

    En gros, ça sert à verifier certains trucs en phase de test. Dire "bein là theoriquement cette expression doit valoir ceci". Attention toutefois, le piege c'est de vouloir l'utiliser pour la gestion des erreurs dues à des paramètres incorrects du logiciel, de la fonctionnalité, de la fonction.

  12. #12
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Lol.
    Cette plaisenterie mise a part,
    ca n'est pas fondamental pour le reste du code qui peut fonctionner sans cela?

  13. #13
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Sachant que c'est actif qu'en phase de test, oui ce n'est pas fondamental pour le reste du code, ça peut aider ... qu'en phase de test.

  14. #14
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    cette pile que j'ai faite, c'est bien une FIFO?

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par deubelte Voir le message
    a quoi ca sert "assert"?
    http://emmanuel-delahaye.developpez....tes.htm#assert

  16. #16
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    http://chgi.developpez.com/pile/

    Dans cette page, il est dit que pour initialiser la pile, il faut dire qu'elle pointe sur le pointeur nul.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            typedef struct pile
            {
                    int valeur;
                    struct pile *prec;
            } pile ;
    Ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            pile *MaPile = NULL;
    Pourquoi ne peut -on pas faire:


    Un pointeur lorsqu'il est déclarer, ne pointe il pas par defaut sur NULL?

    C'est un peu la différence entre:


    et

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Un pointeur lorsqu'il est déclarer, ne pointe il pas par defaut sur NULL?
    Absolument pas en C ou en C++.
    C'est un pointeur non-initialisé, il peut pointer n'importe où (le plus souvent dans le décor).
    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.

  18. #18
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    a se moment la, pourquoi le sommet d'une pile doit pointeur sur NULL et pas dans le decors?

  19. #19
    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
    cette pile que j'ai faite, c'est bien une FIFO?
    Non, une pile fonctionne selon un mode LIFO (Last-In/First-Out). Dans ce contexte, je ne fois pas l'intérêt de trier une pile.

    Si tu désires implanter une file (FIFO) de priorité, utilise effectivement le tri par tas qui est la méthode la plus efficace.

    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++

    +

  20. #20
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Si tu désires implanter une file (FIFO) de priorité, utilise effectivement le tri par tas qui est la méthode la plus efficace.
    OK, c'est pas trop dur a programmer?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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