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 :

gestion structure / liste chainée à deux niveaux


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Points : 30
    Points
    30
    Par défaut gestion structure / liste chainée à deux niveaux
    bonjour,

    je vous explique le probleme:

    On gère un écheancier grâce à une liste chainée à deux niveaux. Chaque bloc de la liste du premier niveau est de la forme:
    *annee sur 4caractères
    *numéro de semaine ( de 01 à 53)
    *pointeur vers la liste des actions de la semaine
    *pointeur vers la semaine suivante

    chaque bloc de la liste chainée des actions est de la forme:
    *jour de la semaine (de 1 à 7 )
    * heure (de 00 à 24)
    * nom de l'action (champs de 10 caractères non terminé par null)
    * pointeur vers l'action suivante

    Je dois creer une structure de données initales en mémoire à partir d'un fichier texte ou chaque ligne donnée, sans séparateur:
    *année, semaine, jour, heure, action
    exemple: 200810312TRAVAILLER

    J'ai deja fait une base comme veux mon prof mais ca coince et je ne vois pas ou. (Je debute)

    je joint ma base, si vous avez une solution ou que vous voulez des explications, je suis la!

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    /** ******************************************* **/
    /** structure definissant jour, heure et action **/
    /** ******************************************* **/
    typedef struct action {
        char action[3]       ;
        char lib[10]         ;
        struct action * suiv    ;
    } action_t;
     
    /** ******************************************* **/
    /** structure definissant l'annee et la semaine **/
    /** ******************************************* **/
    typedef struct annee {
        char    anneesemaine[6]  ;
        action_t * action        ;
        struct  annee * suiv     ;
    } annee_t;
     
     
    /** ******************************************* **/
    /** initialisation des variables globales       **/
    /** ******************************************* **/
     
    annee_t  * premierniveau = NULL ;
    action_t * secondniveau  = NULL ;
     
    /** ******************************************** **/
    /**         fonction gerant les pointeurs        **/
    /**  deplace les pointeurs de tete dans la
    /**  fonction insere
    /**
    /**  -endroit: indique quel pointeur changer     **/
    /** ******************************************** **/
    /*
    void pointeur(annee_t ** prec, action_t ** preca, annee_t * nouv, action_t * nouva, int endroit)
    {
        if (endroit == 1)
        {
            * prec = nouv;
            preca  = &nouv -> action;
        }
        else
        {
    */
    /** ******************************************** **/
    /**   fonction gérant les deux structures        **/
    /**  - entree: nom fichier                       **/
    /**  - sortie: rien                              **/
    /** ******************************************** **/
     
    void insere (annee_t ** tete, char nomfichier[])
    {
    	char annee[6];                      /** sauvegarde temporaire annee semaine **/
    	char action[3];                      /** sauvegarde temporaire jour heure **/
    	char lib[10];                    /** sauvegarde temporaire action **/
     
    	annee_t  ** prec  = tete;
    	action_t ** preca = NULL;
    	annee_t  *  nouv  = NULL;
    	action_t *  nouva = NULL;
     
        FILE  * fichier = NULL;
     
        fichier = fopen(nomfichier,"r");
     
    	fscanf(fichier, "%6c", annee);
    	fscanf(fichier, "%3c",  action);
        fscanf(fichier, "%10c", lib);
     
        while (feof(fichier) != 1)
        {
            nouv = (annee_t *) malloc (sizeof(annee_t));
            strncpy(annee,nouv -> anneesemaine,6);
            * prec = nouv;
            preca  = &nouv -> action;
     
            while(feof(fichier) != 1 && strncmp(nouv -> anneesemaine, annee, 6) == 0)
            {
                nouva   = (action_t *) malloc (sizeof(action_t));
                strncpy(action, nouva -> action, 3);
                strncpy(lib, nouva -> lib, 10);
                * preca = nouva;
     
                fscanf(fichier, "%6c", annee);
                fscanf(fichier, "%3c",  action);
                fscanf(fichier, "%10c", lib);
            }
        }
        fclose(fichier);
    }
     
    int main()
    {
        char nomfichier[64];
     
     
        printf("entrer le nom du fichier\n");
        scanf("%s", nomfichier);
     
        premierniveau = (annee_t *) malloc (sizeof(annee_t));
        insere(&premierniveau, nomfichier);
     
        return 0;
    }

  2. #2
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    Je n'ai pas tout regardé, mais je vois déjà une groOOossse boulette avec les paramètres de strncpy :

    le premier est la destination
    le deuxième est la source
    or tu fais le contraire.

    Du coup, tu copies des chaînes qui contiennent de la mémoire non initialsée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            nouv = (annee_t *) malloc (sizeof(annee_t));
            strncpy(annee,nouv -> anneesemaine,6);
    Tu écrases la donnée que tu viens de lire (annee) avec une donnée non initialisée (nouv->anneesemaine) !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            nouv = (annee_t *) malloc (sizeof(annee_t));
            strncpy(nouv -> anneesemaine,annee,6);
    serait mieux...

    Un autre détail me chiffonne : le role de la globale secondniveau.
    Puisque tes structures annee_t pointent chacune sur leur propre liste de action_t, tu n'as pas besoin de garder un pointeur global sur les action_t (d'ailleur, dans ton code, tu ne t'en serts pas).

    En plus, les globales, c'est mal
    Tu pourrais créer une belle structure qui contiendrait un pointeur vers le premier annee_t. Je suis sûr qu'en faisant évoluer ton projet, tu auras d'autres infos qui trouveront tout naturellement leur place dedans.

    Enfin, je vois poindre un autre gros problème quand tu voudras parcourir tes listes : quand tu alloues tes structures annee_t et action_t, tu oublies d'initialiser les pointeurs suiv. Du coup en les parcourant, quand tu arrievras à la dernière de la liste, tu te trouveras avec un pointeur qui vaut n'importe quoi...
    Pour l'instant, en debug, le compilo initialise peut être tout à zero (du coup, tes pointeurs sont à NULL), mais il ne faut surtout pas le supposer !

    Hadrien

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Points : 30
    Points
    30
    Par défaut
    merci ca va deja un peu mieux

  4. #4
    Membre habitué Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Points : 190
    Points
    190
    Par défaut
    pas de quoi

    Hadrien

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

Discussions similaires

  1. structure liste chainée
    Par cobra150 dans le forum Débuter
    Réponses: 2
    Dernier message: 11/12/2010, 11h13
  2. Programmer Structure+Liste Chainé
    Par Dalidou dans le forum Débuter
    Réponses: 10
    Dernier message: 21/01/2010, 11h16
  3. Comment réaliser une liste déroulante à deux niveaux !?
    Par Dubbiker dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 01/07/2007, 12h51
  4. Réponses: 3
    Dernier message: 12/05/2006, 04h31
  5. Réponses: 24
    Dernier message: 30/10/2005, 10h27

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