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