En fait les trois sont des "containers", au même titre qu'une liste ordonnée, une file, un vecteur etc... Ce qui différencie un container d'un autre c'est :
- son implémentation
- les possibilités qu'il offre (ses méthodes ou les fonctions qui s'y rapportent)
- sa complexité (la vitesse à laquelle on accède à une donnée, la vitesse à laquelle on supprime une donnée)
Par exemple dans une liste doublement chaînée tu mailles un maillon vers son successeur (comme dans une liste chaînée), mais aussi vers son prédécesseur. En outre ça permet de parcourir la liste dans les deux sens de manière efficace. En effet avec une liste simplement chaînée, si je suis rendue au ième élément, je suis obligée de reparcourir toute la liste pour trouver l'élément (i-1). En contrepartie la liste simplement chaînée stocke moins d'informations et est plus facile à implémenter.
J'espère que ça t'éclaire un peu ?