La fonction supprime un élément d'une des listes doublement chainées de la table de hachage. On doit donc réaliser avant destruction de l'élément (le free() ligne 64) le nouveau chainage qui permet de relier ce qui précède (pt_pred ligne 46) dans la liste l'élément à supprimer avec ce qui le suit (pt_succ ligne 45).
Schématiquement (en rouge, l'élément à supprimer) :
Avant :
table_hachage
...
NULL personne_t----->personne_t---->personne_t---->personne_t---...--->NULL
\ / \ / \ / \ / \
<------- <-------- <-------- <--------- <-------
....
Changement du chainage
table_hachage
... ------------------>
/ \
NULL personne_t----->personne_t personne_t---->personne_t---...--->NULL
\ / \ / \ / / \
<------- <--------- \<------- / <-----
... <--------------------
Destruction table_hachage
... ------------------>
/ \
NULL personne_t----->personne_t personne_t---...--->NULL
\ / \ / \ / \
<------- <--------- \ / <-----
... <--------------------
Si il y a un élément qui suit ( if(pt_succ != NULL) ligne 48) alors son nouveau précédent est le précédent de l'élément à enlever ( pt_succ->pred = pt_pred; ligne 50)
Si il y a un élément qui précède ( if(pt_pred != NULL) ligne 53) alors son nouveau successeur est le successeur de l'élément à enlever ( pt_pred->succ = pt_succ; ligne 55)
Si c'est le premier élément de la liste (pas de précédent, ligne58), son adresse figure dans la table de hachage comme début de la liste et il faut changer cette valeur pour celle du nouvel élément de début de la liste, son successeur(ligne 60 et 61)
On peut maintenant détruire l'élément qui est sorti du chainage de la liste et du tableau de hachage (ligne 64)
Partager