M3103 – TP3 Exercice 2

Nous avons montré précédemment que les listes simplement chaînées présentent entre autres un inconvénient majeur : celui d’interdire le retour arrière. Cette impossibilité nécessite, même pour les opérations élémentaires et indispensables comme la suppression d’un élément, de mémoriser au minimum le pointeur vers l’élément précédent au fur et à mesure du parcours. Cependant, toute permutation, tout déplacement (en particulier les tris) deviennent inutilement complexes et malcommodes.

L’alternative est de construire des éléments possédant un double chaînage, vers le précédent et vers le suivant. En fait, chaque information appartient à deux listes simples inverses l’une de l’autre.

Le parcours de la liste double pouvant être effectué à tout moment dans les deux sens, il est normal qu’elle possède deux points d’entrée, la Tete et la Queue.

Dans l’exercice “Sentinelle dans une liste simple”, nous avons montré que les ajouts/suppressions en tête pouvaient être banalisés en insérant au début de la liste, et dès sa construction, un élément “vide”, appelé sentinelle.

Le problème est le même pour les listes doubles, et se reproduit avec les opérations d’ajout/suppression en queue. C’est pourquoi les listes doublement chaînées sont généralement implémentées avec deux sentinelles, appelées naturellement sentinelles de tête et sentinelle de queue. Ainsi, la structure d’une liste double vide est illustrée dans l’encadré supérieur de la figure ci-dessous :

Travail à effectuer
Ajouter à la classe CNode :

  1. la donnée membre m_Prev;
  2. l’accesseur et le modifieur correspondants;
  3. le corps du constructeur et du destructeur de la classe.

Modifier, dans la classe CList, le constructeur, les fonctions AddAfter() et Delete().
Ajouter la fonction AddBefore() de profil :

void AddBefore (const std::shared_ptr < CNode < T>> &, const T & val);    

M3103 – TP3 Exercice 3

L’ordre des éléments dans une liste LRU ne dépend que de l’ancienneté du dernier accès à chaque élément, ce qui implique deux conséquences :

    1. même si la liste est triée à un instant donné, chaque insertion ou recherche a probablement pour effet de modifier l’ordre de la liste (sauf si ce ne sont que de accès en tête). L’algorithme de recherche à utiliser est donc celui d’une recherche séquentielle dans un ensemble non trié.
    2. l’utilisateur ne peut plus choisir la position à laquelle un élément doit être inséré dans la liste : la propriété “LRU” impose qu’elle soit toujours effectuée en tête.

Travail à effectuer
Modifier la classe CList pour qu’elle réponde au propriété “LRU”.

Nb: on considère que l’affichage ne modifie pas l’ordre des éléments de la liste.

M3103 – TP4 Exercice 4

  1. Faites en sorte de pouvoir afficher votre arbre sans utiliser de fonction d’aide dite “locale”.
  2. Afficher la vue arborescente de l’arbre : chaque fils est décalé d’une indentation par rapport à son père.

M3103 – Amphis

Amphi 1 :

  1. Récursivité
  2. Adresse mémoire
  3. Pointeurs en mémoire dynamique

https://ens.casali.me/wp-content/uploads/2017/09/Amphi1.pptx

Amphi 2 :

  1. Quelques problèmes avec les pointeurs en mémoire dynamique
  2. Idiome RAII
  3. Avant propos pour les listes chainées
  4. On veut faire quoi?
  5. Structure et fonctionnalités d’un nœud
  6. Une première liste chainée
  7. Classe pour liste chainée
  8. Technique de la sentinelle

https://ens.casali.me/wp-content/uploads/2017/09/Amphi2.pptx

Amphi 3 :

  1. Structures d’arbres
  2. Diverses implémentations d’un arbre binaire et n-aire
  3. Parcours d’arbres

https://ens.casali.me/wp-content/uploads/2017/09/Amphi3.ppt

Amphi 4 :

  1. Smart Pointers
  2. Liste chainée avec smart pointers
  3. Structures de données pour la recherche

https://ens.casali.me/wp-content/uploads/2017/09/Amphi4.pptx

Lien pour amphi 3 (23 / 09 /20) :

  • zoom : 954 8259 6058
  • pwd : prénom de la personne qui a fait le cours d’algo au début du semestre 1.