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 :

Fin de liste chainée, erreur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut Fin de liste chainée, erreur
    Bonjour, je vous expose mon cas. Je réalise une méthode de compression huffman. Pour cela je veux réaliser l'arbre, grâce à une liste chainée.
    Donc au départ j'ai une liste chainée d'arbre trié par l'occurence de chaque arbre. Ma fonction huffConstruitArbre(liste * l) doit construire l'arbre.

    En gros je prend les 2 premiers arbre que je fusionne (la fusion est ok). Je supprimer les 2 première cases de la liste. Et j'insère le nouvel arbre dans la liste dès que je trouve une occurence plus grande que celle de mon arbre.

    Pour être clair, si jai les occurence 1- 1 - 1 - 1 - 2 - 2- 3. En déroulant je dois avoir 1+1=2 , je déplace le 2 juste avant le 3. Ma liste devient 1 1 2 2 2' 3. La fonction est appellé récursivement. Donc ca continue j'ai de nouveau 1+1=2. La liste est maintenant 2 2 2' 2'' 3. C'est ici que cela va coincé. Le code fait bien 2+2=4. Il doit alors le placé a la fin de la liste, après le 3. Mais cela ne fonctionne pas, il y a un bug et j'ai une sortie de programme. Voilà une partie de mon code. L'erreur se produit apparament lorsque je cherche la bonne place pour inséré 4 dans mon exemple.

    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
     
     
    //boucle pour placer le nouvel élément dans la liste
    while (ab->nbocc >= abtemp->nbocc && temp->suivant != NULL) 
    {                                                                    
           //on utilise abtemp pour la comparaison, l'arbre généré par la valeur de temp
     
            //temp2 sert à mémoriser la case n-1, celle avant le nouvel arbre  
           temp2=temp  ;   
     
           //temp est incrémenté en prenant la valeur suivante dans la liste
           temp = temp->suivant; 
     
           //l'arbre temporaire prend la valeur d l'arbre de temp
           abtemp = temp-> a; 
           printf("temp : %d\n", abtemp->nbocc); 
    }
     
    if (temp->suivant= NULL) 
    {
          system ("PAUSE");
    }
     
    //afusion recoit le nouvel arbre
    afusion->a = ab; 
     
    //la cellule qui suit afusion est temp (car on viens de l'incrémenter)
    afusion->suivant = temp; 
     
    //Le prédécesseur de afusion est temp2
    temp2->suivant = afusion;
    Voilà merci de m'aider et bon wek-end à tous

    ---------------------------------------
    Edit : Pensez à faire une bonne indentation pour une bonne lisibilité du code. Merci Hiko-seijuro

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut
    Salut

    Je suis pas un pro, mais si je comprend bien le fonctionnement de ton prog, lorsque tu arrive a "nbocc=4", avec la boucle while tu va parcourir toute ta liste pour finir par tomber sur "temp->suivant == NULL".

    Ensuite logiquement c'est system("PAUSE") qui est lancé, je ne sais pas exactement ce que fait cette commande mais c'est elle qui doit te faire une exception...

    Tu peux rajouter un petit printf dans ton if et apres ton if pour voir si ce que je dis est vrai...

    En espérant t'avoir aidé.
    Bon week-end

  3. #3
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    Merci de me répondre, ce if ne sert a rien en fait dans le programme, je testais des choses et jai oublié de le supprimer pour le poster ici.
    L'erreur se produit apparament lorque j'ai temp->suivant==NULL . La compilation est ok, mais jai une sortie de programme a ce moment la. Une bug mémoire je pense

  4. #4
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Par défaut
    C'est bon j'ai trouvé mon erreur , ma liste n'était pas initialisé...

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

Discussions similaires

  1. Liste chainée & Erreur de segmentation
    Par max0u13 dans le forum Débuter
    Réponses: 3
    Dernier message: 13/03/2012, 10h56
  2. Réponses: 4
    Dernier message: 27/04/2009, 19h33
  3. Liste Chainée -> Pointer Exception Erreur
    Par pingouinos_64 dans le forum Général Java
    Réponses: 1
    Dernier message: 26/02/2009, 23h40
  4. Ajout à la fin d'une liste chaine
    Par youssef222 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2008, 18h35
  5. liste chainée et insertion en fin ou debut
    Par bonjour69 dans le forum C
    Réponses: 7
    Dernier message: 21/12/2005, 20h50

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