Exercice : L'insertion
Nous nous proposons de corriger le code :
1
void fonc(Tmaillon **ptliste, int i, int pos){
2
Tmaillon **ptl=ptliste ;
3
Tmaillon *ptaux=(Tmaillon *)malloc(sizeof(Tmaillon)) ;
4
ptaux->val=i ;
5
while(*ptl !=NULL && pos) {
6
*ptl=(*ptl)->lien ;
7
--pos ;
8
}
9
ptaux->lien=*ptl ;
10
*ptl=ptaux ;
11
return ;
12
}
void fonc(Tmaillon **ptliste, int i, int pos){ Tmaillon **ptl=ptliste ; Tmaillon *ptaux=(Tmaillon *)malloc(sizeof(Tmaillon)) ; ptaux->val=i ; while(*ptl !=NULL && pos) { *ptl=(*ptl)->lien ; --pos ; } ptaux->lien=*ptl ; *ptl=ptaux ; return ; }
Cette version est-elle satisfaisante ? (oui/non)
L'introduction du pointeur local ptl a pour objectif de ne pas modifier le pointeur de tête de liste pendant le parcours.
Dans le cas d'une insertion nécessaire en tête de liste, nous avons ptl==ptliste, donc le pointeur de la liste est bien modifié.
Toutefois, l'instruction « *ptl=(*ptl)->lien ;
» n'est pas bonne, car elle modifie le lien pointé par ptl, donc le même que celui pointé par ptliste. Nous nous retrouvons avec la même erreur que précédemment.
Il faut remplacer l'instruction par « ptl=&(*ptl)->lien ;
» afin de modifier le pointeur ptl plutôt que le lien pointé.