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 :

[FIFO] fonction retirer le premier element


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut [FIFO] fonction retirer le premier element
    Bonjour,

    voilà j'ai implémenter une FIFO suivant le modèle suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct noeud_file s_noeud_file;
     
    struct noeud_file
    {
       s_noeud_arbre *p_noeud_arbre;
       s_noeud_file *p_suivant;
    };

    dans cette file je sauvegarde les adresses des noeuds d'un arbre binaire de recherche (pour pouvoir faire ensuite un parcours en largeur)

    Ma file ce présente comme suit:

    j'ajoute à partir de la gauche, et je retire à partir de la droite. Le point d'entre de ma file est un pointeur sur le dernier element qui lui même pointe sur le premier élément.

    Je voudrais faire une fonction dequeue minimaliste, et voilà comment j'ai implémenté l'histoire, lorsque je déroule le code à la main sa fonctionne, quelqu'un pourrait t'il juste confirmer que c'est bon(j'ai tjs un peu de mal quand il s'agit de pointeur sur pointeur).

    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
    /* --------------------------------------------------------------------------
       retirer_dans_file ()
       --------------------------------------------------------------------------
       Role : retourne l'information utile du premier noeud
       --------------------------------------------------------------------------
       Condition : la file n'est pas vide
       -------------------------------------------------------------------------- */
    s_noeud_arbre *retirer_dans_file (s_noeud_file **p_pdernier)
    {
       /* on utilise un pointeur temporaire pour memoriser une adresse */
       s_noeud_file **p_ptmp = &(*p_pdernier)->p_suivant;
     
       /* on sauvegarde l'information utile a revoyer */
       s_noeud_arbre *p_noeud_arbre = (*p_ptmp)->p_noeud_arbre;
     
       /* on doit libere le noeud lu */
       (*p_pdernier)->p_suivant = (*p_ptmp)->p_suivant;
       free (*p_ptmp), *p_ptmp = NULL;
     
       return p_noeud_arbre;
    }
    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    D'ici, je ne vois rien qui me choque.

    Simplement, en chaînage simple j'ai tendance à "enfiler" en queue de liste, car je trouve plus facile de retirer la tête...
    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.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    D'ici, je ne vois rien qui me choque.

    Simplement, en chaînage simple j'ai tendance à "enfiler" en queue de liste, car je trouve plus facile de retirer la tête...

    Je viens de tester et à l'exécution ça foire

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par exhortae Voir le message
    Je viens de tester et à l'exécution ça foire
    Il faudrait le code complet pour comprendre pourquoi cela plante.

    Jc

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    J'ai mis le code du projet dans un zip (voir fichier file.c)

  6. #6
    Expert confirmé
    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
    Par défaut
    Il faut remettre le pointeur de liste à NULL si un seul élément était dans la liste
    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
    s_noeud_arbre *retirer_dans_file (s_noeud_file **p_pdernier)
    {
       /* on utilise un pointeur temporaire pour memoriser une adresse */
       s_noeud_file *p_ptmp = (*p_pdernier)->p_suivant;
     
       /* on sauvegarde l'information utile a revoyer */
       s_noeud_arbre *p_noeud_arbre = p_ptmp->p_noeud_arbre;
     
     
       (*p_pdernier)->p_suivant = p_ptmp->p_suivant;
       /* Un seul élément dans la liste ? */
       if(p_ptmp == *p_pdernier) *p_pdernier = NULL;
       /* on doit libere le noeud lu */
       free (p_ptmp);
       return p_noeud_arbre;
    }

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    En faite c'est ce que j'avais fais dans la première version

    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
     
    /* --------------------------------------------------------------------------
       retirer_dans_file ()
       --------------------------------------------------------------------------
       Role : retourne l'information utile du premier noeud
       --------------------------------------------------------------------------
       Condition : la file n'est pas vide
       -------------------------------------------------------------------------- */
    s_noeud_arbre *retirer_dans_file (s_noeud_file **p_pdernier)
    {
       /* on sauvegarde le pointeur sur la structure de donnee a renvoye */
       s_noeud_arbre *p_noeud_arbre = (*p_pdernier)->p_suivant->p_noeud_arbre;
     
       /* il faut libere le noeud */
     
       if (*p_pdernier == (*p_pdernier)->p_suivant)
       {
          /* Si il ne reste qu'un seul noeud dans la file */
          free (*p_pdernier), *p_pdernier = NULL;
       }
       else
       {
          /* on sauvegarde l'adresse du premier noeud dans un pointeur
             temporaire */
          s_noeud_file *p_tmp = (*p_pdernier)->p_suivant;
     
          (*p_pdernier)->p_suivant = p_tmp->p_suivant;
     
          free (p_tmp), p_tmp = NULL;
       }
     
       return p_noeud_arbre;
    }
    mais j'avais voulu trouver une version qui regroupe tous les cas en 1. Je sais pas si c'est possible.

  8. #8
    Expert confirmé
    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
    Par défaut
    Je ne pense pas qu'avec ta liste bouclée sur elle même tu puisses faire l'économie du test genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(p_ptmp == *p_pdernier) *p_pdernier = NULL;

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Oui effectivement y'avait un souci, dans le cas où il y a qu'un seul noeud, la dernière instruction

    ne mettait pas à nul le noeud en entier, mais seulement le champ p_suivant du noeud

    Merci

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 18/11/2006, 12h48
  2. Regroupement en fonction des 8 premiers caractères
    Par 306xshdi dans le forum Access
    Réponses: 4
    Dernier message: 06/11/2005, 10h18
  3. Comment mettre le premier element DbLookUpCombo
    Par CheGueVerra dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/12/2004, 20h45
  4. [langage] supprimer le premier élément d'un tableau
    Par Kinethe dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2004, 15h39
  5. [langage] Retirer le premier caractère d'une chaine ?
    Par kwisach dans le forum Langage
    Réponses: 5
    Dernier message: 24/04/2003, 11h05

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