Les Listes

download Les Listes

of 39

Transcript of Les Listes

  • 7/31/2019 Les Listes

    1/39

    1

    Chapitre 14: Les listes (structures dynamiques)

    Contenu:

    Rappel sur la gestion de la mmoire

    Notion de liste Liste simple

    Liste circulaire bidirectionnelle

    Pile et File

    Concepts

    Implantation sous forme de liste

    Liste gnralise

    Applications

  • 7/31/2019 Les Listes

    2/39

    2

    Rappel: gestion de la mmoire lors de lexcution

    La mmoire est subdivise en 3 parties:

    La partie statique contenant principalement le code des

    fonctions

    La Pile (Stack) run time qui contient principalement les

    variables crs statiquement

    Le Tas (Heap) run time qui contient les variables cresdynamiquement (par un new)

    Code HeapStack

    Sommet du stack Limite de l

    a zone utilise par le heap(il existe une freelist de zone mmoire allouable)

    Zone de mmoirenon encore utilise

  • 7/31/2019 Les Listes

    3/39

    3

    Gestion mmoire dentits statiques

    Stack

    Stack

    :

    { int i, j, k;

    :

    { int i, j, k;

    :

    { double r;

    i

    Stack

    k

    j

    Stack

    i

    kj

    r

    :

    { int i, j, k;

    :

    { double r;:

    }

    :

    { int i, j, k;

    :

    { double r;:

    }

    }

    Stack

    i

    kj

  • 7/31/2019 Les Listes

    4/39

  • 7/31/2019 Les Listes

    5/39

    5

    Gestion de structures dynamiques

    But:

    grer des structures de donnes contenant plusieurs entits et

    dont le nombre dentits varie tout au long de lexcution duprogramme

    Exemple:

    La liste dlments:

    = liste vide

    : on ajoute 7

    : on ajoute 21

    : on ajoute 3

    : on supprime 3 : on ajoute 5

  • 7/31/2019 Les Listes

    6/39

    6

    Quest-ce quune liste chane ? Une collectiondlments possdant chacun deux composantes : un

    pointeur vers le prochain lment de la liste et une

    valeur de nimporte quel type.

    Implmentation : les listes chanes

    Adr #1

    4

    Adr #2

    3

    Adr #3

    5

    NULL

  • 7/31/2019 Les Listes

    7/39

    7

    Listes chanes

    class elem;

    typedef elem* liste;

    class elem {public:

    TypeOfInfo info;liste next;elem():info(0),next(NULL){}elem(TypeOfInfo i, liste n):info(i),next(n) {}

    };

    main() {

    liste first = new elem(5, NULL);first = new elem(3,first);first = new elem(4,first);

    }

    Adr #1

    4

    Adr #2

    3

    Adr #3

    5

    NULL

    // alternative

    class elem {public:

    TypeOfInfo info;elem* next;elem():info(0),next(NULL){}elem(TypeOfInfo i, elem* n):info(i),next(n){}

    };

    typedef elem* liste;

  • 7/31/2019 Les Listes

    8/39

    8

    Listes chanes

    Parcours

    void Parcours(liste tete)

    {

    for(liste p=tete; p != NULL; p= p-> next)

    cout info info != x; p = p-> next);return p!=NULL;

    }

  • 7/31/2019 Les Listes

    9/39

    9

    Listes chanes

    Recherche dun lment (renvoie le pointeur)

    liste Element(liste tete, TypeOfInfo x) {

    liste p;

    for(p=tete; p!=NULL && p->info != x; p = p-> next);return p;

    }

  • 7/31/2019 Les Listes

    10/39

    10

    Listes chanes

    Insertion en tte

    void InsertionEnTete(liste &tete, TypeOfInfo x) {

    tete = new elem(x,tete);}

    Insertion en tte (2ime version : dcomposition des

    oprations)void InsertionEnTeteV2(liste& tete, TypeOfInfo x) {

    liste p = new elem;

    p -> info = x;

    p -> next = tete;tete = p;

    }

    X

    Y

    p

    tte

  • 7/31/2019 Les Listes

    11/39

    11

    Listes chanes

    Insertion en fin de liste (1)

    void InsertionEnFin(liste &tete, TypeOfInfo x) {

    if (tete == NULL) // dans une liste videtete = new elem(x,NULL);

    else { // dans une liste non vide

    liste q = tete;

    liste p = tete->next;while (p != NULL) {

    q = p;

    p = p -> next;

    }q -> next = new elem(x,NULL);

    }

    }

    Y

    X

    p

    q

  • 7/31/2019 Les Listes

    12/39

    12

    Listes chanes

    Insertion en fin de liste (2)

    void InsertionEnFinV2(liste &tete, TypeOfInfo x) {

    liste q = NULL;

    liste p = tete;

    while (p != NULL) {

    q = p;

    p = p -> next;}

    p = new elem(x,NULL);

    if (q == NULL)

    tete = p; // liste videelse

    q -> next = p;

    }

  • 7/31/2019 Les Listes

    13/39

    13

    Listes chanes

    Insertion en fin de liste (3)

    void InsertionEnFinV3(liste& tete, TypeOfInfo x) {

    liste p;

    if (tete == NULL) {tete = new elem;p = tete;

    }

    else {for (p = tete; p-> next != NULL; p = p->next);p->next = new elem;p = p->next;

    }p->info = x;p->next = NULL;

    }

  • 7/31/2019 Les Listes

    14/39

    14

    Listes chanes

    Insertion dans une liste trie (1)

    void InsertionTriee(liste & tete, TypeOfInfo x) {

    if (tete == NULL || tete -> info > x)

    tete = new elem(x,tete);else {

    liste q = tete;

    liste p = tete->next;

    while (p != NULL && p->info next;

    }q -> next = new elem(x,p);

    }

    }

  • 7/31/2019 Les Listes

    15/39

    15

    Listes chanes Insertion dans une liste trie (2)

    void InsertionTrieeV2(liste &tete, TypeOfInfo x) {

    liste q = NULL; liste p = tete;

    while (p != NULL && p->info next;

    }

    if (q == NULL) { // insertion en dbut de liste

    tete = new elem;q = tete;

    }

    else {

    q -> next = new elem;q = q->next;

    }

    q -> info = x;

    q -> next = p;

    }

  • 7/31/2019 Les Listes

    16/39

    16

    Listes chanes

    Suppression dun lment de la liste

    Llment supprimer est en tte de liste (X)

    Llment supprimer est en milieu de liste (Y)

    Llment supprimer est en fin de liste (Z)

    X Y Zq p

    X Y Z

    X Y Z

    q p

    X Y Z

    X Y Z

    q p

    X Y Z

    tte tte

  • 7/31/2019 Les Listes

    17/39

    17

    Listes chanes Suppression dun lment de la liste

    void Suppression(liste & tete, TypeOfInfo x) {liste q = NULL;liste p = tete;

    while (p != NULL && p->info != x) {q = p;p = p -> next;

    }

    if (p != NULL) {if (q == NULL)

    tete = p->next;else

    q->next = p->next;delete p;

    }}

  • 7/31/2019 Les Listes

    18/39

    18

    Listes chanes

    Suppression dune listevoid SuppressionListe(liste & tete) {

    while (tete != NULL) {

    liste p = tete;

    tete = tete -> next ;

    delete p;

    }}

  • 7/31/2019 Les Listes

    19/39

    19

    Listes (doublement) chanes circulaires

    Adr #1

    4

    Adr #2

    3

    Adr #3

    5

    Adr #1

    Adr #1

    bidonAdr #2

    3Adr #3

    5Adr #1

    Adr #3 Adr #1 Adr #2

    Liste chane circulaire

    Liste doublement chane circulaire

  • 7/31/2019 Les Listes

    20/39

    20

    7

    Adr #1

    Adr #2

    Listes doublement chanes circulaires

    Adr #1

    vide

    Adr #2

    3

    Adr #3

    vide *

    Adr #1

    Adr #3 Adr #1

    Adr #1

    Pour se simplifier la vie, la liste vide en fait constitue dunlment spcial (lment bidon ) ne contenant pasdinformation: on appelle parfois cet lment prtte"

    Adr #1

    * 0 mis pas le constructeur

    Fait par : tete = new elem;

    qui met previous et next this

    tete

  • 7/31/2019 Les Listes

    21/39

    21

    Listes doublement chanes circulaires

    Dclaration de la classe elem (doublement lie)

    class elem;typedef elem* liste;

    class elem {

    public:TypeOfInfo info;liste previous; // ajout du pointeur vers le prcdentliste next;elem(): info(0),previous(this), next(this){}elem(TypeOfInfo i, liste p, liste n):

    info(i),previous(p), next(n){}};

    liste tete = new elem;

    this est unpointeur vers

    lobjet dans

    lequel on est

  • 7/31/2019 Les Listes

    22/39

    22

    Listes doublement chanes circulaires

    Supprimer un lment de la listevoid Suppression(liste tete, TypeOfInfo x) {

    liste p = tete->next;

    tete->info=x;while (p->info != x)p = p -> next;

    if (p != tete) {// on a donc trouv x (pas celui dans la pretete

    p->previous->next = p->next;p->next->previous = p->previous;delete p;

    }}

    Z

    n

    p

    X

    n

    Y

    n

    pp

  • 7/31/2019 Les Listes

    23/39

    23

    Listes doublement chanes circulaires

    Insrer un lment devant un autre lment dela liste

    void InsAvant(liste e, TypeOfInfo x) {

    liste r = new elem(x, e->previous, e);e->previous->next = r;e->previous = r;

    }

    Z

    n

    p

    X

    n

    Y

    n

    p

    p

    e

  • 7/31/2019 Les Listes

    24/39

    24

    Listes doublement chanes circulaires

    Insertion en tte de liste (mais aprs la prtte)

    void InsertionEnTete(liste tete, TypeOfInfo x) {

    InsAvant(tete->next, x);

    }

    Insertion aprs un lment

    void InsApres(liste e, TypeOfInfo x) {

    InsAvant(e->next, x);

    }

    Insertion en fin de liste (donc avant prtte)

    void InsFin(liste tete, TypeOfInfo x) {

    InsAvant(tete, x);

    }

  • 7/31/2019 Les Listes

    25/39

    25

    Implmentation dune relation m-n

    Reprsentation graphique (UML) de fait que chaque

    personne peut tre dans plusieurs groupes de

    discussion et que chaque groupe de discussion a

    plusieurs personnes.

    PersonnesGroupes de

    discussion* *

    Chaque personne a une liste de groupes de discussion Chaque groupe de discussion a une liste de personnes

    + on ne veut pas dupliquer les info sur les personnes et groupes

    + on veut pouvoir mettre des info concernant

    chaque lien personne-groupe

    Info surLe lien

  • 7/31/2019 Les Listes

    26/39

    26

    Implmentation dune relation m-n (matrice creuse)

    => Objets lien 7 champs de donnes

    PnextPersonne Pprec

    InfoGprec

    GnextGroupe

    listeP

    Prtte

    Gilles

    Marc

    Thierry

    listeG

    Prtte

    Jogging

    Montagne

    VTT

  • 7/31/2019 Les Listes

    27/39

    27

    Implmentation dune relation m-n (matrice creuse)

    listeP

    Prtte

    Gilles

    Marc

    Thierry

    liste

    G

    Pr

    tte

    Jogg

    ing

    Mon

    tagne

    VTT

    GJ GM

    MM MV

    TJ TM TV

  • 7/31/2019 Les Listes

    28/39

    28

    Piles

    Une pile est une structure de donne dynamique utilisant leprincipe LIFO (last in, first out)

    4 oprations sont permises

    IsEmpty: test si la pile est vide

    Top : lecture du sommet de pile (sans effet sur la pile)

    Pop : suppression du sommet de pile

    Push : ajout dun lment sur la pile

    Une pile est quivalente une simple liste chane

    3

    4

    2

    13

    Push Pop13

    2

    4

    3

    tete

  • 7/31/2019 Les Listes

    29/39

    29

    Piles

    La classe pile est dfinie sur base

    d lments, comme la liste

    class Element;typedef Element* Stack;

    class Element {

    public:

    Stack next;int data;

    Element(): next(NULL),data(0){}

    Element(Stack n, int d) : next(n), data(d) {}

    };

  • 7/31/2019 Les Listes

    30/39

    30

    Piles

    Ajouter un lment au sommet de pilevoid Push(stack &S, int d) {

    S = new Element (S, d);}

    Tester si la pile est videbool IsEmpty(S) {

    return S == NULL;}

    Supprimer le sommet de pile

    void Pop(stack &S) {

    if (! IsEmpty(S)) {stack T = S;

    S = S->next;delete T;

    } // si la pile est vide, il ne se passe rien}

  • 7/31/2019 Les Listes

    31/39

    31

    Piles

    Lire le sommet de pile (si la pile nest pas vide)

    int Top(stack S) {

    return S->data;

    }

    Dtruire la pilevoid DeleteStack(stack &S) {

    while (! IsEmpty(S)) {stack T = S;S = S->next;delete T;

    }}

  • 7/31/2019 Les Listes

    32/39

    32

    Files

    Une file est une structure de donne dynamique utilisant leprincipe FIFO (first in, first out)

    4 oprations sont permises

    IsEmpty: test si la file est vide

    First : lecture du premier de la file (sans effet sur la file)

    TakeOut : sortie d un lment de la file

    PutIn : entre d un lment dans la file

    Une file est quivalente une simple liste chane (+ dernier)

    3

    4

    2

    13

    PutIn

    TakeOut13

    2

    4

    3

    first

    last

    In

    Out

  • 7/31/2019 Les Listes

    33/39

    33

    Files

    La classe file est dfinie sur base

    dlments, comme la listeclass Element;

    typedef Element* ptr;

    class Element {

    ptr next;

    int data;Element():next(NULL),data(0){}

    Element(ptr n, int d) : next(n), data(d) {} };

    class Queue {public:

    ptr first, last;

    };

  • 7/31/2019 Les Listes

    34/39

    34

    Files

    Entrer un lment dans la filevoid PutIn(Queue &Q, int d) {

    ptr temp = new Element (NULL, d);if (IsEmpty(Q))

    Q.first = temp;else

    Q.last->next = temp;Q.last = temp;

    }

    Sortir un lment de la filevoid TakeOut(Queue &Q) {

    if (! IsEmpty(Q)) {ptr p = Q.first;Q.first = Q.first->next;

    if (IsEmpty(Q))last = NULL;

    delete p;}// si la pile est vide, il ne se passe rien

    }

  • 7/31/2019 Les Listes

    35/39

    35

    Listes gnralises

    Une liste gnralis est construite partir dlments possdant

    chacun deux pointeurs vers dautres lments : D (down) pointe

    vers une liste situe un niveau infrieur, S (same) pointe vers

    une liste situe au mme niveau

    Exemple :

    Problme : parcourir la liste gnralise niveau par niveau

    Dans lexemple : 1 6 7 / 5 2 4 / 3

    1 D S

    4 D S5 D S

    7 D S6 D S

    3 D S

    2 D S

  • 7/31/2019 Les Listes

    36/39

    36

    Listes gnralises - Les classes

    La classe ListeGen est aussi dfinie sur basedlments

    class ElGen

    typedef ElGen* ListeGen;

    class ElGen {public:

    ListeGen D, S;int data;ElGen():D(NULL),S(NULL),data(0){}

    ElGen(ListeGen d, ListeGen s, int x) : D(d), S(s), data(x){}};

  • 7/31/2019 Les Listes

    37/39

    37

    Listes gnralises - Parcours par niveau

    void ParcourslisteGen(ListeGen L) {if (L != NULL) {

    Queue Q;

    PutIn(Q,L);while (! IsEmpty(Q)) {ListeGen p = First(Q);TakeOut(Q);while (p != NULL) {

    cout data D != NULL) PutIn(Q,p->D);p = p->S;

    }

    }}

    }

    On utilise une file dont

    les lments contiennent

    des pointeurs vers des

    lments de la liste

    gnralise (ElGen)

    Exercice : modifier le programme

    pour que les donnes saffichent

    raison dune ligne par niveau

  • 7/31/2019 Les Listes

    38/39

    38

    Application - Notation polonaise inverse

    La notation algbrique directe (NAD) classique peut tre

    traduite en une autre notation appele polonaise inverse (NPI,

    Jan Lukasiewicz, 1878-1956), et vice-versa

    Exemple : A+(B*C)+(D/E) A B C * + D E / +

    Lorsquon a sous la main une expression en NPI, il est

    extrmement simple de lvaluer : il suffit, en parcourant

    lexpression de gauche droite, dempiler les oprandes,

    de les dpiler lorsquon rencontre un oprateur et de les remplacer alors

    par le rsultat de lopration

    Exemple : Push(S,A); Push(S,B); Push(S,C); Multiply(S);Add(S); Push(S,D); Push(S,E); Divide(S); Add(S); et le rsultat

    se trouve au sommet de la pile => cout

  • 7/31/2019 Les Listes

    39/39

    39

    Application - Traduction NAD vers NPI

    On ne traite que les oprateurs binaires +, -, *, /, ^ et les ( )

    Les priorits sont ordonnes comme suit : ( ) < +, - < *, / < ^

    En parcourant lexpression NAD de gauche droite : Oprande : directement transmise en sortie

    Oprateur : tant que le sommet de la pile a une priorit suprieure ou

    gale celle de loprateur dentre, on le sort de la pile ; ensuite, on

    empile loprateur rencontr lentre Parenthse ouvrante : empile

    Parenthse fermante : tant que le sommet est diffrent dune parenthse

    ouvrante, on le sort de la pile ; la parenthse ouvrante en question est

    dpile mais non transmise en sortie Fin de lexpression dentre : tout ce qui reste sur la pile est transmis en

    sortie