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

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2018
    Messages : 6
    Points : 8
    Points
    8

    Par défaut Probleme afficher File

    Bonjour à tous, j'ai un petit soucis sur mon affichage de file, quand je compile, la fonction m'affiche uniquement la 1ere cellule soit [a]. Je trouve pas le probleme qui m'empeche de parcourir la suite des cellules. Je précise que les signatures me sont imposés.
    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
    void creerFileVide(file *F){
        F->deb = NULL;
        F->fin = NULL;
    }
     
    int estVide(file F){
        if(F.deb == NULL){
            return 1;
        }
        else{
            return 0;
        }
    }
     
    void enfiler(file *F,char v){
     
        cellule *nouveau = malloc(sizeof(struct cell));
        if (nouveau == NULL){
            fprintf(stderr,"Erreur : probleme allocation dynamque\n");
            exit(EXIT_FAILURE);
        }
        nouveau->val = v;
        nouveau->suiv = NULL;
     
        if(estVide(*F)==1){
            F->deb = nouveau;
            F->fin = nouveau;
        }
        else{
            F->fin->suiv = nouveau;
            F->fin = nouveau;
        }
    }
     
    void afficherFile(file *F){
        if (estVide(*F)==1){
            printf("La file est vide, il n'y a rien a afficher");
        }
     
        file *temp = F;
     
        while(temp->deb->suiv != NULL){
            printf("[%c]",temp->deb->val);
            temp = temp->deb->suiv;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct cell{
        char val;
        struct cell *suiv;
    } cellule;
     
     
    typedef struct {
        cellule *deb;
        cellule *fin;
    } file;
    Merci d'avance d'avoir pris le temps pour lire

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 191
    Points : 20 481
    Points
    20 481
    Billets dans le blog
    1

    Par défaut

    Bonjour
    Citation Envoyé par SpinBox Voir le message
    Je précise que les signatures me sont imposés.
    Et personnellement je trouve ça assez bien car je les trouve assez logiques et (presque) complètes (ne manque qu'un pointeur sur "prec" dans la structure "cellule"). Malheureusement tu ne les as pas bien comprises...
    La structure "file" contient un pointeur sur le premier élément ainsi que sur le dernier. C'est en quelque sorte un truc assez invariant qui englobe toute la liste en un seul ensemble. La seule variation se produit à l'ajout et au retrait du premier ou du dernier maillon. Il en résulte que pour l'affichage, ce n'est pas un "file" qu'il faut créer mais une simple cellule. C'est elle qui va varier sur les cellules de la file, pas la file qui, elle, ne bouge pas.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void afficherFile(file *F){
        if (estVide(*F)==1){
            printf("La file est vide, il n'y a rien à afficher");
            return;
        }
     
        cellule *temp;
     
        for (temp=F->deb; temp != NULL; temp=temp->suiv){
            printf("[%c]",temp->val);
        }
    }

    Pour l'insertion il y a aussi un souci. En effet, tu ne peux pas assigner "nouveau" à F->fin et F->fin->suiv. Le dernier élément ne peut se mettre qu'à un seul endroit, pas à deux (je te laisse chercher seul ce point particulier)...

    Citation Envoyé par SpinBox Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int estVide(file F){
        if(F.deb == NULL){
            return 1;
        }
        else{
            return 0;
        }
    }
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int estVide(file *F  /* Le passage par adresse est plus rapide que le passage par copie */){
        return (F->deb == NULL);              // Voire même return ! F->deb mais ça devient presque trop compact...
    }
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : novembre 2018
    Messages : 6
    Points : 8
    Points
    8

    Par défaut

    En effet, tu as bien raison l'affiche marche correctement maintenant. Pour l'insertion est ce que cela est correcte ?
    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
    void enfiler(file *F,char v){
     
        cellule *nouveau = malloc(sizeof(struct cell));
        if (nouveau == NULL){
            fprintf(stderr,"Erreur : probleme allocation dynamque\n");
            exit(EXIT_FAILURE);
        }
        nouveau->val = v;
        nouveau->suiv = NULL;
        cellule *temp;
        temp = F->fin;
        if(estVide(F)==1){
            F->deb = nouveau;
            F->fin = nouveau;
        }
        else{
            temp->suiv = nouveau;
            F->fin = nouveau;
        }
    }

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 191
    Points : 20 481
    Points
    20 481
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par SpinBox Voir le message
    Pour l'insertion est ce que cela est correcte ?
    Ben en fait, je viens de réaliser que la première version était en réalité correcte. En effet, le nouveau maillon vient après l'ex dernier donc F->fin->suiv=nouveau et comme il se place à la fin, F->fin=nouveau.
    Et comme t'as rien changé (sauf à rajouter ce "temp" intermédiaire mais tout aussi inutile que le H" de "Hawaï") ben ça reste correct aussi.
    Sauf qu'on ne quitte jamais une fonction via "exit". Si souci insoluble, alors on remonte à l'appelant qui prend une décision (et s'il ne peut pas, alors lui-aussi remonte à l'appelant et etc jusqu'au main)

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cellule *enfiler(file *F,char v){
        cellule *nouveau = malloc(sizeof(struct cell));
        if (nouveau == NULL) return NULL;
        nouveau->val = v;
        nouveau->suiv = NULL;
     
        if (estVide(F) == 0)   // Toujours mettre en premier le cas qui arrivera statistiquement le plus fréquemment (peut-être serait-il plus judicieux d'écrire une fonction "estNonVide")...
            F->fin->suiv = nouveau;
        else
            F->deb = nouveau;
        F->fin = nouveau;
        return nouveau;
    }
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

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

Discussions similaires

  1. [Fichier] Problème Form File
    Par cdrc78 dans le forum Struts 1
    Réponses: 7
    Dernier message: 26/06/2006, 11h20
  2. [Debutant]Probleme ds file de message
    Par Treuze dans le forum C
    Réponses: 2
    Dernier message: 31/05/2006, 15h38
  3. Probleme afficher au centre d'une frame
    Par brasco06 dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 18/02/2006, 21h51
  4. Probleme affich/cach tablo, HELP
    Par rigolman dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 21/10/2005, 14h01

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