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 :

optimisation d'une file fifo


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut optimisation d'une file fifo
    Bonjour à tous,

    j'ai implémenté une fonction qui ajoute un élément dans une file, j'aimerais optimiser cette fonction mais je ne sais pas comment le faire.
    Pouvez vous m'aidez s'il vous plaît ?

    voici ma fonction :

    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
     
    typedef int bool;
    #define False 0
    #define True  1
     
    typedef struct Fifo
    {
        int *donnee;
        struct Fifo *suivant;
    } Fifo;
     
    void fifo_add( Fifo **p_fifo, int *val)
    {
      Fifo *new_fifo, *p_courant;
     
      /* on créer un nouvel élément de la file */
      new_fifo=Malloc(1,Fifo);
      assert(new_fifo != NULL); 
     
      /* on fait pointer l'élément vers null */
      new_fifo->suivant=NULL;
     
      /* on assigne aà l'élément la donné que l'on veut ajouter*/
      new_fifo->donnee=val;
      /* si la file est vide, alors on fait pointer la file vers l'élément que l'on vient de créer */
      if(fifo_isempty(*p_fifo))
      { 
       *p_fifo=new_fifo;
      }
      else
      {
         p_courant=*p_fifo;
        while(p_courant->suivant!=NULL)
        {
          p_courant=p_courant->suivant;
        }
         p_courant->suivant=new_fifo;
      }
    return;  
    }
    Cordialement,
    Takout

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    si tu ne vois pas comment le faire, peut-être est-ce parce que tu ne peux pas.
    Une liste, si tu ne possèdes que son élément de tête à manipuler, tu n'as pas grand choix : tu parcours chaque élément jusqu'à arriver en fin de file et ajouter le nouveau.
    Soit ce que tu fais.

    Par contre, pourquoi utiliser un int* en données ? Fourni par l'utilisateur qui plus est : risque de passer un pointeur qui causera un crash parce que libéré entre temps.
    Et le return à la fin est inutile.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Pour ta file, tu peux avoir deux pointeur : l'un sur le début de la file et l'autre sur la fin pour éviter de devoir parcours l'ensemble de ta file à chaque insertion.

    Si tu n'as qu'un seul pointeur tu peux remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      if(fifo_isempty(*p_fifo))
      { 
       *p_fifo=new_fifo;
      }
      else
      {
         p_courant=*p_fifo;
        while(p_courant->suivant!=NULL)
        {
          p_courant=p_courant->suivant;
        }
         p_courant->suivant=new_fifo;
      }
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            Fifo ** p_courant= p_fifo;
            while(fifo_isempty(*p_courant))
            {
                      p_courant = &(*p_courant)->suivant;
             }
             *p_courant = new_fifo;
    En gros tu fait un parcours indirect, ainsi tu parcours toute ta liste indépendamment du fait que le maillon soit premier ou non.
    Par contre je me suis peut-être trompé dans l'écriture à vérifier tout de même.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Le int * c'est parce que j'utilise des tableaux en valeur dans ma file.
    Le reurn c'est par habitude on m'a toujours appris qu'une fonction doit retourner quelques choses.

    Neckara je pense que ta solution peut me faire gagner du temps.

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Disons qu'avec 2 pointeurs, tu ne rajoute qu'une affectation lors de l'insertion et pour toutes les autres opérations, tu n'as aucune ou pratiquement aucune modification.

    Avec 1 seul pointeur tu as un parcours complet de la liste (donc plusieurs affectations etc...). Si ta liste est grande on va dire 10 000 maillons, la différence va se faire sentir.


    Après, tu peux utiliser une liste simplement chaînée ou doublement chaînée.
    La liste doublement chaînée simplifiera l’algorithme des insertions suppressions et te permettra aussi de parcourir ta liste en sens inverse.
    Mais si tu utilise une file, je suppose que tu ne fait que des insertions en queue et suppression en tête, dans ce cas là avoir des maillons doublement chaîné ne sert pas trop.


    J'y pense que maintenant mais tu peux aussi avoir qu'un seul pointeur et utiliser une file circulaire.
    Ton pointeur (= ta liste) pointerais sur le dernier élément et le dernier élément pointe sur le premier élément.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par takout Voir le message
    Le reurn c'est par habitude on m'a toujours appris qu'une fonction doit retourner quelques choses.
    Une fonction qui retourne void ne retourne.. rien.
    return sert à sortir de la fonction.
    Quand le programme rencontre l'accolade fermante, il sort de la fonction.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    On met le return si un jour on veut éventuellement changer le type de retour de la fonction (mettre un booléen par exemple) pour voir très rapidement où mettre la valeur de retour et pour ne pas a avoir à réécrire le 'return' ?

    De toute façon mettre return; ne coûte rien et ce n'est en soit pas faux, je pense que c'est plus une raison de lisibilité du code qu'autre chose, même si je ne vois pas vraiment l'utilité d'écrire le return.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Voilà j'ai fais ajout d'un élément avec deux pointeurs :
    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
     
     
    void fifo_add( Fifo **p_fifo,Fifo **fin,int *val)
    {
      Fifo *new_fifo;
     
      /* on créer un nouvel élément de la file */
      new_fifo=Malloc(1,Fifo);
      assert(new_fifo != NULL); 
     
      /* on fait pointer l'élément vers null */
      new_fifo->suivant=NULL;
     
      /* on assigne aà l'élément la donné que l'on veut ajouter*/
      new_fifo->donnee=val;
      /* si la file est vide, alors on fait pointer la file vers l'élément que l'on vient de créer */
      if(fifo_isempty(*p_fifo))
      { 
       *p_fifo=new_fifo;
       *fin=new_fifo; 
      }
      else
      {
         (*fin)->suivant=new_fifo;
         *fin=new_fifo;
      }
    return;  
    }

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 34
    Par défaut
    Citation Envoyé par Neckara Voir le message
    De toute façon mettre return; ne coûte rien et ce n'est en soit pas faux, je pense que c'est plus une raison de lisibilité du code qu'autre chose, même si je ne vois pas vraiment l'utilité d'écrire le return.
    Dans certains projets, c'est demandé explicitement en tant que règle de codage.

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

Discussions similaires

  1. Implémenter une file Fifo
    Par Chakalaka dans le forum VHDL
    Réponses: 0
    Dernier message: 29/09/2008, 20h01
  2. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54
  3. Optimisation d'une recherche et mise à jour
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/01/2005, 18h38
  4. Réponses: 17
    Dernier message: 03/12/2004, 11h17
  5. [Debutant] Optimisation d'une boucle
    Par Javatator dans le forum Langage
    Réponses: 3
    Dernier message: 25/10/2004, 18h50

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