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 :

FILE avec une liste chaînée à doubles pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut FILE avec une liste chaînée à doubles pointeurs
    Bonsoir,
    j'essaye d'écrire un programme en c qui contient les fonctions de base de manipulation d'une File .Comme le titre l'indique le modèle que j'essaye de développer consiste à une liste chaînée à double pointeurs c'est à dire un pointeur sur la cellule suivante ,un pointeur sur la cellule précédente et la tete de la liste chaînée pointe sur la queue de la File tout en considérant le pointeur du début de la File égale à NULL et le pointeur de fin de File égale à NULL .
    Apres le Build et le Run l'exécutable cesse de fonctionner .
    Pièce jointe 426030
    Pièce jointe 426034
    Pourriez vous m'aider à trouver le probleme s'il vous plait et merci.
    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
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct Element Element;
    struct Element
    {
        int data;
        Element* prec;
        Element* suiv;
    };
     
    typedef struct File File ;
    struct File
    {
        Element *premier;
    };
    void init(File *ff)
    {
        Element *nouveau=malloc(sizeof(*nouveau));
        ff->premier=nouveau;
        nouveau->prec=NULL;
        nouveau->suiv=NULL;
    }
    void enfiler(File *ff,int a)
    {
        Element *nouveau=malloc(sizeof(*nouveau));
        if ((ff==NULL) || (nouveau==NULL))
        {
            exit(EXIT_FAILURE);
        }
        else if (ff->premier == NULL)
        {
            init(ff);
            ff->premier->data=a;
        }
        else
        {
            ff->premier->prec=nouveau;
            nouveau->suiv=ff->premier;
     
            ff->premier=nouveau;
            nouveau->prec=NULL;
            nouveau->data=a;
        }
    }
    int defiler(File *ff,int *x) //retourne 0 si c'est impossible de défiler 1 sinon
    {
        Element *adefile=malloc(sizeof(*adefile));
        if ((ff==NULL)||(adefile==NULL))
        {
            exit(EXIT_FAILURE);
        }
        else if (ff->premier ==NULL)
        {
            return 0;
        }
        else
        {    adefile=ff->premier;
            while (adefile->suiv !=NULL)
            {
                adefile=adefile->suiv;
            }
            *x=adefile->data;
            adefile->prec->suiv=NULL;
            free(adefile);
            return 1;
        }
    }
    void afficher(File *ff)
    {
       Element *actuel=malloc(sizeof(*actuel));
      if ((ff=NULL)||(actuel==NULL))
      {
          exit(EXIT_FAILURE);
      }
      actuel=ff->premier;
      while (actuel->suiv!= NULL)
      {
          printf("\n%d",actuel->data);
          actuel=actuel->suiv;
      }
    }
    int main()
    {
        File *f=malloc(sizeof(*f));
        init(f);
        enfiler(f,5);
        enfiler(f,4);
        enfiler(f,369);
        enfiler(f,25);
        enfiler(f,18);
        enfiler(f,125);
     
        afficher(f);
        int a,b,z,y;
        z=defiler(f,&a);
        y=defiler(f,&b);
     
        afficher(f);
        printf("a=%d",a);
        printf("b=%d",b);
     
        return 0;
    }

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    Déjà il me semble qu’il y a une fuite mémoire dans enfiler ();.

    Tu alloues «*nouveau*». Si ff->premier=NULL alors «*nouveau*» ne sert à rien et est perdu par la même occasion.
    D’ailleurs on peut faire la même remarque dans défiler (); pour «*adefile*».

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut
    Nouveau dans enfiler et adefile dans défiler jouent respectivement le rôle de cellule complémentaire et intermédiaire dans les deux fonction plus précisément dans "else". J'ai allouer les deux pointeurs au début pour pouvoir faire le test de réussite d'allocation dans "if " et tout cela pour éviter le type d'erreur qu'on puisse avoir si nouveau= NULL dans nouveau->prec=NULL.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Cela ne change rien à la validité de la remarque : tu omets de stocker une adresse dont tu as la responsabilité. Tu fais ton allocation trop tôt, dans la séquence de contrôle commune, alors que tu ne devrais l'effectuer que dans la branche pertinente.

    D'ailleurs tu malloc beaucoup trop souvent : à quoi peut bien servir une allocation dynamique lorsque l'on retire un élément de la file ? Lorsque l'on en affiche le contenu ? Dans main (crée une variable sur la pile) ? Tu devrais avoir un seul appel à malloc dans tout le programme, à la rigueur deux si tu tiens à cloisonner le traitement d'init.

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par kerrons Voir le message
    Nouveau dans enfiler et adefile dans défiler jouent respectivement le rôle de cellule complémentaire et intermédiaire dans les deux fonction plus précisément dans "else". J'ai allouer les deux pointeurs au début pour pouvoir faire le test de réussite d'allocation dans "if " et tout cela pour éviter le type d'erreur qu'on puisse avoir si nouveau= NULL dans nouveau->prec=NULL.
    Je comprends que tu veuilles faire une «*économie*» en ne faisant qu’un if mais il n’empeche que tu as une fuite mémoire !
    Je poursuis mes commentaires. Faire un exit(); dans une fonction n’est pas très «*propre*». Il vaudrait mieux que ta fonction retourne un booléen qui indiquerait la réussite ou l’echec de son exécution.

    Pour finir, dans la fonction main(); tu peux faire l’economie d’une allocation dans le tas pour f. Un simple File f; suffit ici. Tu transmets ensuite son pointeur à tes différentes fonctions.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    gerald3d a parfaitement raison dans toutes ses remarques. Tu alloues avant de vérifier si l'allocation est nécessaire et donc si ce n'est pas le cas tu perds le maillon alloué.
    De même comme il le dit ton allocation de "File" dans le main() est totalement inutile (comme d'une manière générale toute allocation d'une zone de taille connue quand on écrit le code). D'autant plus que tu ne libères pas cette allocation. Donc de fait ton main() pourrait s'écrire plus simplement ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        File f;
        init(&f);
        enfiler(&f,5);
        enfiler(&f,4);
        enfiler(&f,369);
        ... (et tout le reste à l'avenant)
    }

    Sinon ici un exemple complet de liste chainée correspondant exactement à ce que tu cherches à faire => liste doublement chainée avant/arrière avec tête de liste contenant un pointeur sur le premier et un sur le dernier.
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 21
    Par défaut
    Merci pour vos remarques j'essayerais d'améliorer le programme et je vous tiendrais au courant des modifications et du résultat .

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/11/2017, 10h10
  2. Réponses: 3
    Dernier message: 31/03/2014, 15h49
  3. Problème avec une liste chaînée
    Par Frednight dans le forum Débuter
    Réponses: 6
    Dernier message: 16/04/2013, 16h28
  4. Réponses: 4
    Dernier message: 21/11/2010, 15h54
  5. Réponses: 3
    Dernier message: 25/10/2007, 21h57

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