Exercice : Du code en vrac
Vous devez reconstituer la séquence d'instructions manquante ci-dessous, en réorganisant les instructions proposées. Les commentaires sont destinés à vous guider dans votre réflexion.
typedef struct mailListeDoubleEnt{
int val ;
struct mailListeDoubleEnt *precedent ;
struct mailListeDoubleEnt *suivant ;
} TmaillonD ;
typedef TmaillonD *TlisteD ;
TlisteD insertionD(TlisteD *ptliste, int i, int pos){
TlisteD courant=*ptliste ; // pointeur de parcours de la liste
TlisteD pere=NULL ; // pointeur sur élément précédent celui désigné par courant
TlisteD ptaux=(TlisteD)malloc(sizeof(TmaillonD)) ;
ptaux->val=i ; // atteindre position d'insertion
while(NULL != courant && 0 != pos--) {
...
return ptaux;
}
typedef struct mailListeDoubleEnt{ int val ; struct mailListeDoubleEnt *precedent ; struct mailListeDoubleEnt *suivant ; } TmaillonD ; typedef TmaillonD *TlisteD ; TlisteD insertionD(TlisteD *ptliste, int i, int pos){ TlisteD courant=*ptliste ; // pointeur de parcours de la liste TlisteD pere=NULL ; // pointeur sur élément précédent celui désigné par courant TlisteD ptaux=(TlisteD)malloc(sizeof(TmaillonD)) ; ptaux->val=i ; // atteindre position d'insertion while(NULL != courant && 0 != pos--) { ... return ptaux; }
if(NULL !=courant) } courant=courant->suivant; pere=courant; else ptliste=&ptaux; pere->suivant=ptaux; if (NULL==pere) ptaux->precedent=pere; ptaux->suivant=courant; courant->precedent=ptaux; Plus d'éléments à catégoriser |
Déposez ici
Déposez ici
Déposez ici // chaînage de ptaux Déposez ici // accès à ptaux depuis début de liste Déposez ici
Déposez ici
Déposez ici
Déposez ici // accès à ptaux depuis le fond de liste Déposez ici
Déposez ici |
L'avancée dans la liste permet de positionner courant sur l'élément occupant le rang pos.
Une fois la position trouvée, le chaînage doit être réalisé :
Dans l'élément en cours d'insertion qui doit pointer sur l'élément en position pos, ainsi que sur le précédent (ici le père) qui peut être nul,
Dans le précédent (père) ou à défaut le pointeur de liste,
Dans l'élément qui se voit déplacé en pos+1, s'il existe.
Le retour est le pointeur sur l'élément inséré.
TlisteD insertionD(TlisteD *ptliste, int i, int pos){
TlisteD courant=*ptliste ;
TlisteD pere=NULL ;
TlisteD ptaux=(TlisteD)malloc(sizeof(TmaillonD)) ;
ptaux->val=i ; // atteindre position d'insertion
while(NULL != courant && 0 != pos--) {
pere=courant ;
courant=courant->suivant ;
}
// les liens de l'élément inséré
ptaux->suivant=courant ;
ptaux->precedent=pere;
// accès à ptaux depuis debut de liste : pere ou pointeur de liste en cas d'insertion en tete
if (NULL==pere)
ptliste=&ptaux;
else pere->suivant=ptaux ;
// accès à ptaux depuis le fond de liste c'est a dire courant
if(courant)
courant->precedent=ptaux;
return ptaux;
}
TlisteD insertionD(TlisteD *ptliste, int i, int pos){ TlisteD courant=*ptliste ; TlisteD pere=NULL ; TlisteD ptaux=(TlisteD)malloc(sizeof(TmaillonD)) ; ptaux->val=i ; // atteindre position d'insertion while(NULL != courant && 0 != pos--) { pere=courant ; courant=courant->suivant ; } // les liens de l'élément inséré ptaux->suivant=courant ; ptaux->precedent=pere; // accès à ptaux depuis debut de liste : pere ou pointeur de liste en cas d'insertion en tete if (NULL==pere) ptliste=&ptaux; else pere->suivant=ptaux ; // accès à ptaux depuis le fond de liste c'est a dire courant if(courant) courant->precedent=ptaux; return ptaux; }