Chap. 1 Structures séquentielles : listes linéaires

Slides:



Advertisements
Présentations similaires
Module Systèmes d’exploitation
Advertisements

GEF 243B Programmation informatique appliquée Listes chaînées I – Tableaux de structures §15.1 – 15.2.
A l’issue des conseils de classe de 3ème,
Tris.
Chap. 4 Recherche en Table
Chapitre 3 Les arbres binaires
Chapitre annexe. Récursivité
Qui a le nombre qui vient après 8 ?
Portée des variables VBA & Excel
Fonctions & procédures
Calculs de complexité d'algorithmes
GEF 243B Programmation informatique appliquée Listes chaînées II §15.1 – 15.2.
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
(Classes prédéfinies – API Java)
Cours n°2M2. IST-IE (S. Sidhom) UE 303 Promo. M2 IST-IE 2005/06 Conception dun système d'information multimédia Architecture trois-tiers : PHP/MySQL &
Paramètres et pointeurs
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
Initiation à la programmation et algorithmique cours 3
Traitement Co-Séquentiel: Appariment et Fusion de Plusieurs Listes
Utilisation des tableaux
Les requêtes La Requête est une méthode pour afficher les enregistrements qui répondent à des conditions spécifiques. La requête est donc un filtre.
Développement d’applications web
ALGORITHMES RECURSIFS
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Structures de données linéaires
A B D A B D LSC avec « sentinelle »
Partie 1 Etude de l'existant
Récursivité.
LOGO Responsable du cours Mlle Amina GHRAB : 1 ère année IAG Institut Supérieur de Gestion de Tunis.
8PRO100 Éléments de programmation Comment faire prendre une décision à un ordinateur?
Les structures de données arborescentes
II. Chaînage, SDD séquentielles
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
Methode de Tri efficace
II. Chaînage, SDD séquentielles
Définition d’un maillon de liste
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les fichiers indexés (Les B-arbres)
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Arbres Rouge noir Démo : INF3105 Structures de données et algorithmes
Expressions régulières et hash tables
Présentation Structures de Données et TDA
Les listes chaînées par Frédérick Henri.
1.1 LES VECTEURS GÉOMÉTRIQUES
Notre calendrier français MARS 2014
IFT 6800 Atelier en Technologies d’information
8PRO107 Éléments de programmation
COURS DE PROGRAMMATION ORIENTEE OBJET :
Excel (Partie 2).
C'est pour bientôt.....
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Plan cours La notion de pointeur et d’adresse mémoire.
Exemple de gestion d'un buffer clavier en liste circulaire
Structures des données
Le langage C Structures de données
Création et présentation d’un tableau avec Word 2007
Ch. PAUL - Piles et Files à l'aide de listes chainées
CALENDRIER-PLAYBOY 2020.
LES PILES ET FILES.
Université Mohammed V-Agdal École Supérieure de Technologie Salé
Notions de pointeurs en C
II. Chaînage, SDD séquentielles
Cours LCS N°4 Présenté par Mr: LALLALI
Structures de données avancées : LH (Hachage linéaire) D. E ZEGOUR Institut National d ’Informatique.
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
 Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
CSI2510 Structures des Données et Algorithmes
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Transcription de la présentation:

Chap. 1 Structures séquentielles : listes linéaires

Exemple (gestion d'un tableau contenant les références des livres d'une bibliothèque.) Ce tableau est rangé dans l'ordre alphabétique. Lorsqu'un nouveau livre est acheté, son insertion dans le tableau en respectant l'ordre requiert de déplacer toutes les références qui suivent la position d'insertion, pour dégager de la place. Pour éviter ce type de problème, il faudrait que le passage d'une case d'un tableau à la suivante ne se fasse plus à partir d'un indice absolu qu'on incrémente, mais en notant localement dans une case du tableau l'indice de la case suivante.

On organise en liste linéaire des donnéess qui doivent être traitées séquentiellement. De plus une liste est évolutive, c.à.d. qu'on veut pouvoir ajouter et supprimer des donnéess.

Les listes : définition Une liste linéaire est une structure de donnéess correspondant à une suite d'éléments. Les éléments ne sont pas indexés dans la liste, mais pour chaque élément (sauf le dernier) on sait où se trouve l’élément suivant. Par conséquent, on ne peut accéder à un élément qu’en passant par le premier élément de la liste et en parcourant tous les éléments jusqu’à ce qu’on atteigne l’élément recherché.

La représentation des listes par deux tableaux le premier tableau contient les éléments de la liste, dans un ordre quelconque. le second tableau est organisé de façon suivante : si la case d’indice i du premier tableau contient l’élément dont le suivant se trouve dans la case d’indice j, alors la case d’indice i de second tableau contient l’entier j.

Exemple a d b \0 0 1 2 3 4 5 3 5 2 \0 0 1 2 3 4 5

Insertion Insérons la lettre « c » dans le premier tableau c a d b \0 0 1 2 3 4 5 2 3 5 \0 0 1 2 3 4 5

La représentation chaînée. On utilise des pointeurs pour chaîner entre eux les éléments successifs, et la liste est alors déterminée par l'adresse de son premier élément. On va définir des enregistrements (structures) dont un des champs est de type pointeur vers une structure chaînée du même type.

Définition d'une structure chaînée. typedef struct nœud { T info; struct nœud *suiv; }nœud; typedef nœud *liste; La liste vide est représentée par le pointeur NULL.

aaaaa bb ddd mm Cette représentation n’impose pas une longueur maximum sur les listes ; elle permet de traiter facilement la plupart des opérations sur les listes : le parcours séquentiel, l'insertion et la suppression d'un élément à une place quelconque, la concaténation de deux listes, se font par une simple manipulation des pointeurs.

Variables dynamiques C'est une variable dont la place mémoire est allouée en cours d'exécution. On ne prend de la place mémoire que lorsqu'on en a besoin. Cette place mémoire est allouée explicitement, c.à.d. par une instruction du langage. Désallocation est aussi proposée par l'intermédiaire d'une instruction.

Exemples d’utilisation

1. Rechercher un élément dans une liste chaînée juste pour savoir si cet élément est présent ou non données : T x, liste p résultat de type logique (entier en C)   Entête en C : int recherche(T x, liste p) ;

{variables locales : logique trouve trouve  faux TANT QUE ((pNULL) et (trouve=faux)) faire { SI (p->info = x) ALORS trouve  vrai SINON p  p->suiv /*l'adresse de la structure suivante*/ } retourner trouve Rmq : Il n’est pas souhaitable de remplacer la condition trouve=faux dans la boucle TANT QUE par p->infox parce que si p pointe sur NULL, p->info n'existe pas.

2. Créer une liste chaînée par ajout successif d'éléments jusqu'à la fin. données modifiées : liste *pp Entête en C : void créer(liste *pp);

{ variables locales : liste cour, temp  *pp  NULL saisir(x) SI (x  fin) ALORS /* fin est une constante de type T */ reserver(*pp) /* crée un poste et met l'adresse dans *pp */ *pp->info  x *pp->suiv  NULL /* obligé de mettre NULL à chaque fin (même temporaire) */ cour  *pp /* cour wagon courant (dernier) auquel on rajoute qqch, cour reçoit *pp, qui est l'adresse du premier élément*/ TANT QUE (x  fin) FAIRE reserver(temp) /*crée la place mémoire d'un wagon */ temp->info  x temp->suiv  NULL 1) cour->suiv  temp /* création du lien */ 2) cour  temp /* cour doit pointer toujours sur la dernière structure, on garde ainsi l'adresse *pp du début de liste */ }

TANT QUE (x  fin) FAIRE { Autre méthode . TANT QUE (x  fin) FAIRE { reserver (cour->suiv) /* idem à reserver(temp); cour->suiv  temp; */ cour  cour->suiv cour->info  x cour->suiv  NULL saisir(x) }

2. Supprimer un élément de la liste. On suppose que la liste existe données : T x données modifiées : liste *pp résultat de type logique /* x=info à supprimer, *pp est une données modifiée, car on peut supprimer le premier de la liste, ok indique si la suppression a eu lieu */ Entête en C : int suppression(T x, liste *pp);

{variables locales : liste prec, cour ; logique ok ok  faux SI (*pp->info = x) ALORS { prec  *pp *pp  *pp->suiv ok  vrai liberer(prec) /*suppression du premier élément */ }

SINON { prec  *pp cour  *pp->suiv TANT QUE ((ok = faux) et (cour  NULL)) FAIRE SI (cour->info = x) ALORS /*cour pointe sur celui à supprimer, prec pointe sur le précédent */ ok  vrai prec->suiv  cour->suiv /* création du lien entre celui qui précède un élément à supprimer et celui qui le suit */ liberer(cour) } prec  cour /* mémorisation de la place d'élément précédent l'élément à tester */ cour  cour->suiv retourner ok

3. Insertion d’un élément dans une liste chaînée triée données T x données modifiées liste *pp Entête en C : void insert (T x, liste *pp);

{variables locales : ptr_liste cour, prec ; logique trouve SI (*pp = NULL) ALORS { reserver(*pp) *pp->info  x *pp->suiv  NULL } SINON SI (x < *pp->info) ALORS reserver(cour) cour->info  x cour->suiv  *pp *pp  cour

SINON { trouve  faux prec  *pp cour  *pp->suiv TANT QUE ((cour  NULL) et (trouve = faux)) FAIRE SI (x < cour->info) ALORS trouve  vrai reserver(prec->suiv) prec  prec->suiv prec->info  x prec->suiv  cour } prec  cour cour  cour->suiv

SI (cour = NULL) ALORS { reserver (prec->suiv) cour  prec->suiv cour->info  x cour->suiv  NULL }

4. Suppression d’un élément d’une liste chaînée triée données : T x données modifiées : liste *pp résultat de type logique Entête en C : int suppr (T x, liste *pp);

{variables locales : ptr_liste cour, prec ; logique trouve trouve  faux SI (*pp  NULL) ALORS SI (x = *pp->info) ALORS { cour  *pp *pp  *pp->suiv liberer (cour) trouve  vrai }

SINON { prec  *pp cour  *pp->suiv TANT QUE ((trouve = faux) et (cour  NULL)) FAIRE SI (x = cour->info) ALORS prec->suiv  cour->suiv liberer (cour) trouve  vrai } SI (x > cour->info) ALORS prec  cour cour  cour->suiv cour  NULL retourner trouve

Il existe d'ailleurs de nombreuses variantes de la représentation des listes à l'aide de pointeurs a) Il est parfois commode de définir une liste non pas comme un pointeur sur une cellule, mais par un bloc de cellules du même type que les autres cellules de la liste. Ce bloc ne contient que l'adresse du premier élément de la liste. L'utilisation d'un tel bloc permet d'éviter un traitement spécial pour l'insertion et la suppression en début de liste. b) On peut aussi créer des listes circulaires : on remplace, dans la dernière place de la liste, le pointeur à NULL par un pointeur vers la tête de la liste ; de plus si l'on choisit la dernière place comme point d'entrée dans la liste, on retrouve la tête de liste en parcourant un seul lien. c) Dans la représentation classique, le parcours des listes est orienté dans un seul sens : du premier élément vers le dernier élément. Cependant de nombreuses applications nécessitent de parcourir les listes à la fois vers l'avant et vers l'arrière, et dans ce cas on peut faciliter le traitement en rajoutant des "pointeurs arrière", ce qui augmente évidemment la place mémoire utilisée. On obtient alors une liste doublement chaîné : chaque place comporte un pointeur vers la place suivante et un pointeur vers la place précédente.

Exemple d'utilisation d'une liste chaînée bidirectionnelle typedef struct doub { T info ; struct doub *suiv, *prec ; } doub ; typedef doub *liste_doub ;

Afficher le contenu d'une liste à l'envers. données : liste_doub p Entête en C : void afficher(liste_doub p); { SI p  NULL ALORS TANT QUE (p->suiv  NULL) FAIRE p  p->suiv TANT QUE (p  NULL) FAIRE afficher (p->info) p  p->prec }