ProgrammeL1 · S2Informatique fondamentale
L1S2Informatique fondamentale

Algorithmique et structures de données 2

Implémenter les listes, piles, files et tris classiques; comparer leurs complexités en C et Python.

#listes#piles#files#tri#C
5chapitres
5exercices corrigés
8questions de quiz
0/5chapitres maîtrisés
À LA FIN DE CE COURS

Objectifs d’apprentissage

  • Implémenter des listes chaînées, piles et files en C ou Python en respectant leurs invariants.
  • Choisir une structure de données selon les opérations dominantes, les coûts et les contraintes mémoire.
  • Coder et expliquer les tris par insertion, sélection et fusion sur des séquences variées.
  • Analyser des complexités en temps et en espace et relier une récurrence à une borne asymptotique.
  • Construire des tests couvrant cas limites, doublons, ordre initial et erreurs de manipulation.
AVANT DE COMMENCER

Prérequis utiles

  • Variables, fonctions, boucles, tableaux et références ou pointeurs ; bases de C et Python.
  • Notions de récursion, tableaux indicés, contrats d’entrée/sortie et tests par assertions.
  • Lecture élémentaire de la notation O, Θ et des preuves par invariant.
CHAPITRE 01 L1 · S2

Listes chaînées

55 min de lectureLeçon originale de révision

Une liste chaînée est une séquence de nœuds, chaque nœud contenant une valeur et une référence vers le suivant. En C, le pointeur NULL marque la fin :

typedef struct Noeud { int valeur; struct Noeud *suivant; } Noeud;

L’accès au i-ème élément est séquentiel, donc en O(i)O(i), tandis que l’insertion en tête est en O(1)O(1). La propriété essentielle est l’invariant « tete désigne le premier nœud et chaque lien mène au nœud suivant ». Une erreur fréquente consiste à perdre le pointeur suivant avant de relier le nouveau nœud, ou à déréférencer une liste vide. Exemple guidé : pour insérer 7 devant 4 → 9, on alloue n, met n->valeur=7, puis n->suivant=tete et enfin tete=n; le résultat est 7 → 4 → 9. Pour supprimer la tête, on mémorise l’ancienne tête, avance tete, puis libère l’ancien nœud. Point de contrôle : expliquer pourquoi parcourir n nœuds coûte O(n)O(n) et écrire le cas liste vide.

Points à retenir
  • Un lien doit être sauvegardé avant toute modification de pointeur.
  • Insertion en tête : coût constant ; accès par position : coût linéaire.
  • Toute suppression doit traiter explicitement la liste vide et libérer la mémoire en C.
Synthèse du chapitre

Une liste chaînée est une séquence de nœuds, chaque nœud contenant une valeur et une référence vers le suivant. En C, le pointeur NULL marque la fin :