Effectivement, c'est la bonne voie.
Dans la boucle for, l'incrément est fait avant le test (sauf, bien sûr en entrée de boucle).
Donc, si on décortique:
1 2 3 4 5 6 7 8
| for( ; pCrl->Suivant; pCrl=pCrl->Suivant)
if( pCrl->Suivant->Element == pCr)
{
pSuivant = pCrl->Suivant->Suivant;
pCrl->Suivant->Suivant = NULL;
delete pCrl->Suivant;
pCrl->Suivant = pSuivant;
} |
Supposons que le dernier élément est celui recherché.
Donc pCrl pointe sur l'avant dernier élément.
if( pCrl->Suivant->Element == pCrl)
est vérifié donc on rentre:
pSuivant = pCrl->Suivant->Suivant;
Là tu récupères le suivant du suivant, donc le suivant du dernier, donc il y a de forte chance que ce soit NULL.
Les deux lignes suivantes déchaînent l'élément et le suppriment.
pCrl->Suivant = pSuivant;
l'élément courant (pCrl) est renchaîné avec NULL.
Retour dans ta boucle: . Donc pCrl vaut NULL.
Test: Déréférencement de NULL, et là boum
Tu auras aussi un problème si deux éléments identiques se suivent. Seul le premier sera déchaîné.
En fait, la boucle est bancale car lorsqu'elle trouve un élément à déchaîner, elle avance d'un pas ce qui fait que l'élément suivant celui qui est déchaîné n'est pas pris en compte.
Autre chose me parait étrange: si l'élément recherché est le premier, on le supprime et on retourne l'élément suivant. Si par contre l'élément n'est pas le premier, alors on parcours toute la liste pour essayer d'enlever toutes les occurrences de l'éléments recherchés. Quelque chose cloche. Soit la boucle est faite pour enlever le premier élément correspondant à celui fourni en argument, soit pour enlever toutes ses occurrences.
Partager