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 :

Problème ordre d'une liste


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Problème ordre d'une liste
    Bonsoir,

    Voila j'ai un soucis lors de l'ordre de lecture d'une liste que j'ai écrite dans un fichier. Par exemple j'écris la liste suivante dans mon fichier:
    ('c', 2) ('u', 2) ('o', 2)
    Puis lors de la lecture la liste que je lis est:
    ('c', 2), ('o', 2), ('u', 2)
    Pourtant je lis dans le bon ordre je ne comprend vraiment pas pourquoi...
    Voici les 3 fonctions que j'utilise pour ceci:

    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
    void ecrireLst(FILE *f, liste l)
    {
        while (l != NULL)
        {
            if (fwrite(&l->data.element->data, sizeof l->data.element->data, 1, f) != 1)
            {
                fputs("ecrireLst: Echec d'ecriture du char", stderr);
                exit(1);
            }
            if (fwrite(&l->data.poids, sizeof l->data.poids, 1, f) != 1)
            {
                fputs("ecrireLst: Echec d'ecriture du int", stderr);
                exit(1);
            }
            l = l->suivant;
        }
     
        return;
    }
    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
    liste lireLst(FILE *f, size_t n)
    {
        liste res = NULL;
        size_t i = 0;
        char c;
        int nb;
        arbre a;
        arbrepoids ap;
     
        for ( ; i < n; i++)
        {
            if (fread(&c, sizeof c, 1, f) != 1)
            {
                libere_listeEntiere(&res);
                fputs("lireLst: Echec de lecture du char", stderr);
                exit(1);
            }
            if (fread(&nb, sizeof nb, 1, f) != 1)
            {
                libere_listeEntiere(&res);
                fputs("lireLst: Echec de lecture du int", stderr);
                exit(1);
            }
            a = feuille(c);
            ap.element = a;
            ap.poids = nb;
            res = creer_liste(ap, res);
        }
     
        return res;
    }
    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
    liste creer_liste (arbrepoids e, liste l)
    {
        /* Allocation memoire */
        liste ma_liste = malloc (sizeof (*ma_liste));
        if (ma_liste)
        {
            liste ptr_l = l;
            ma_liste->data = e;
            ma_liste->suivant = NULL;
     
            /* Cas de l'insertion dans une liste nulle */
            if (l == NULL)
            {
                return ma_liste;
            }
            /* Cas de l'insertion en tete de liste */
            if (ma_liste->data.poids < ptr_l->data.poids)
            {
                ma_liste->suivant = ptr_l;
     
                return ma_liste;
            }
            /* Cas autres */
            while (ptr_l->suivant != NULL && ptr_l->suivant->data.poids < ma_liste->data.poids)
            {
                ptr_l = ptr_l->suivant;
            }
            /* Insertion apres */
            ma_liste->suivant = ptr_l->suivant;
            ptr_l->suivant = ma_liste;
     
            return l;
        }
        else
        {
            fprintf (stderr, "creer_liste : erreur, probleme d'allocation memoire.\n");
            exit (1);
        }
     
        return NULL;
    }
    N'hésitez pas à me demander d'autre partie de code si cela peut mieux vous aider Merci

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    La raison est dans creer_liste().
    Si on regarde ce qui se passe à chaque entrée au niveau des tests, on a :
    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
    Liste    Vide
                            Première entrée 
                            if (l == NULL) -> OUI
    Liste  ('c', 2)          
    
                            Deuxième entrée 
           ptr_l ->('c', 2) if (l == NULL)-> NON
                            if (ma_liste->data.poids < ptr_l->data.poids) -> NON
                            while(ptr_l->suivant != NULL -> NON
    Liste ('c', 2)->('u', 2)
    
                            Troisième entrée
           ptr_l ->('c', 2) if (l == NULL) NON
                            if (ma_liste->data.poids < ptr_l->data.poids) NON
                            while( ptr_l->suivant != NULL -> OUI
                            && ptr_l->suivant->data.poids < ma_liste->data.poids -> NON
    Liste ('c', 2)->('o', 2)->('u', 2)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Ah oui en effet le problème venait bien de ce test, erreur d'inattention Merci beaucoup d'avoir pris le temps de vérifier cette fonction qui est quand même assez rébarbatif

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

Discussions similaires

  1. [AJAX] Sauvegarder l'ordre d'une liste après modification par javascript
    Par Ashgenesis dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 07/02/2008, 15h54
  2. Changer l'ordre d'une liste
    Par ethno dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/01/2008, 12h19
  3. problème pour appeler une liste de catégorie
    Par minie dans le forum Struts 1
    Réponses: 11
    Dernier message: 29/05/2007, 16h39
  4. Problème pour afficher une liste déroulante
    Par Oli_Ifre dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2007, 09h11
  5. Problème pour positionner une liste déroulante
    Par ouckileou dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/09/2004, 01h05

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