Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Les listes chainées en C

Les listes chainées en C

Les listes chainées en C

351064ceb33623d2cd4973bfcd14552c?s=128

Boughida Adil

April 22, 2022
Tweet

More Decks by Boughida Adil

Other Decks in Education

Transcript

  1. Les listes chainées en C

  2. Introduction • Une liste chainée est un ensemble fini d’éléments

    enchainés. • Les éléments d’une chaines s’appellent des nœuds (ou maillon, élément, etc.). • Chaque nœud est constitué de deux parties: données et pointeur. • Le pointeur enchaine un nœud à son suivant. • Vous pouvez simuler les listes chainées à un train. 2
  3. Introduction • Une liste chainée est une structure de données

    qui change durant l’exécution. – Les noeuds successifs sont connectés par des pointeurs. – Le dernier noeud pointe sur NULL. – Elle peut augmenter ou diminuer en taille lors de l'exécution d'un programme. – Elle ne perd pas d'espace mémoire. 3 A B C Tête
  4. Introduction • Garder la trace d’une liste chainée: – On

    doit connaitre le pointeur sur le 1er élément de la liste (appelé début, tête, etc.). • Les listes chainées sont flexibles en ajout d’éléments pour être réarrangées efficacement. – Insérer un élément. – Supprimer un élément. 4
  5. Illustration: Insertion 5 A A Élément à insérer X X

    A B C B C
  6. Illustration: Suppression 6 A B A B C C Élément

    à supprimer
  7. Introduction • Insertion: – Un enregistrement (noeud) est créé en

    maintenant le nouvel élément. – Le pointeur suivant du nouvel enregistrement est configuré pour le lier à l'élément qui le suit dans la liste. – Le pointeur suivant de l'élément qui doit précéder doit être modifié pour pointer vers le nouvel élément. • Suppression: – Le pointeur suivant de l’élément qui précède immédiatement celui à supprimer est modifié pour pointer vers le suivant de l’élément supprimé. 7
  8. Opérations basiques • Création d’une liste • Parcourir une liste

    • Insertion d’un élément dans une liste • Supprimer un élément d’une liste • Concaténer deux listes en une 8
  9. Étude de cas • Tout noeud est une structure (ou

    enregistrement). • Soit la structure d’un noeud, et un type de données appelé noeud defini à partir de cette structures: typedef struct noeud { int val; LISTE suiv; } noeud; 9
  10. Étude de cas • Ensuite, on defini un nouveaux type

    nommé “LISTE” qui est un pointeur qui pointe sur un noeud. typedef struct noeud *LISTE • On peut donc déclarer un nouveau pointeur nomée “tete” par: LISTE tete; 10
  11. Création d’une liste

  12. Comment débuter? • Pour commencer, nous devons créer un nœud

    (le premier nœud), et de faire tete pointer sur lui. tete = malloc(sizeof(noeud)); 12 tete val suiv
  13. Comment débuter? • La fonction creeNoeud() permet de faire ça

    13 LISTE cree_noeud(int e) { LISTE tete; tete = malloc(sizeof(noeud)); tete ->val = e; tete ->suiv = NULL; return tete; }
  14. Comment débuter? … • S'il y a n nombre de

    nœuds dans la liste chaînée initiale: – Allouer n enregistrements, un par un. – Lire les champs des enregistrements – Modifier les chainages des noeuds pour que la chaine soit formée. 14 A B C tete
  15. Parcourir et afficher une liste

  16. Quoi faire? • Une fois la liste chainée a été

    construite et tete pointe sur le 1er élément de la liste, – Suivre les pointeurs – Afficher les contenus des noeuds comme ils sont parcourus. – S’arrêter quand le pointeur suiv pointe vers NULL. 16
  17. void afficher(LISTE tete) { LISTE p; p = tete; while

    (p != NULL) { printf ("\n %d →", p->val); count++; p = p->suiv; } printf ("\n"); } 17
  18. Insérer un noeud dans une liste

  19. Continuer… • Quand un noeud est ajouté au début, –

    Seulement un seul pointeur suiv devra être modifié. • Tete pointera sur le nouveau noeud. • Le nouveau noeud pointera sur l’ex premier élément. • Quand un noeud est ajouté à la fin, – Deux pointeurs suiv seront modifiés • Le dernier noeud pointe sur le noeud ajouté • Le nouveau noeud pointe sur NULL. • Quand un noeud est ajouté au milieu, – Deux pointeurs suiv seront modifiés • Le noeud précédent pointe sur le noeud ajouté • Le nouveau noeud pointe sur le noeud suivant. 19
  20. 20 LISTE insererTete(int e, LISTE tete) { LISTE b =

    creeNoeud(e); b->suiv = tete; tete = b; return l; } LISTE insererQueue(int e, LISTE tete) { // A VOUS DE LA FAIRE !! }