les listes doublement chaînées en c

Upload: yassir-matar

Post on 06-Apr-2018

278 views

Category:

Documents


1 download

TRANSCRIPT

  • 8/3/2019 Les listes doublement chanes en C

    1/16

  • 8/3/2019 Les listes doublement chanes en C

    2/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 2 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    I - IntroductionII - PrincipeIII - La pratique

    III-A - La structure d'un maillonIII-B - InitialisationIII-C - Insertion d'un lmentIII-D - Suppression d'un lmentIII-E - Accs l'lment prcdentIII-F - Accs au premier lmentIII-G - Suppression de la liste

    IV - ConclusionV - Autres documentationsVI - RemerciementsVII - Code source complet

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    3/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 3 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    I - Introduction

    Aprs avoir vu les listes simplement chanes, pour cette seconde partie, nous allons nous attarder sur les listesdoublement chanes.

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    4/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 4 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    II - Principe

    A la diffrence des listes simplement chanes, les maillons d'une liste doublement chane possdent un pointeursur l'lment qui les prcdent :

    Figure 1 : reprsentation d'un lment d'une liste doublement chane.

    Le fait d'avoir accs l'lment prcdent va nous permettre de simplifier les fonctions de la bibliotque prcdente :

    Il n'est plus ncessaire d'utiliser une sentinnelle pour retrouver le premier lment de la liste ce qui permet dese passer de la structure qui englobait la liste simplement chane

    L'insertion d'un lment peut se faire aussi bien avant qu'aprs celui pass en paramtre de la fonction

    Il est maintenant possible de supprimer l'lment pass en paramtre et non plus le suivant

    Il faut une fonction qui retourne le maillon prcdent

    A part ces quelques points, les fonctions ont un fonctionnement identique.

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    5/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 5 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    III - La pratique

    III-A - La structure d'un maillon

    Pour obtenir la structure de base d'une liste doublement chane, il suffit d'ajouter un pointeur sur l'lment prcedent la structure item_svue dans l'article prcdent. Comme la sentinelle est devenue inutile, il n'est plus ncessairede crer une structure d'encapsidation de la liste.

    stypedef struct dll

    {

    struct dll *prev;

    struct dll *next;

    void*data;

    } dll_s;

    III-B - Initialisation

    L'initialisation de la liste est devenue inutile, cependant la fonction est conserve pour tre sr que le pointeur estmis NULL :

    dll_s *dll_new (void)

    {

    return (NULL);

    }

    III-C - Insertion d'un lment

    Le principe est identique celui des listes simplement chane, il ne faut pas oublier de mettre jour le pointeursur l'lment prcdent.

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    6/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 6 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    Figure 2 : reprsentation de l'insertion d'un lment.

    1 Voici l'tat de la liste avant l'appel de la fonction2 Le pointeur p_preprsente l'argument de la fonction, c'est donc aprs lui qu'il faut insrer un maillon3 p_npointe sur l'lment qui suit4 Cration d'un nouvel lment point par p_l5 On commence par faire pointer le nouvel lment sur le maillon qui suit p_p(donc p_n) sans oublier de faire

    pointer ce dernier vers notre nouvel lment puisque maintenant la liste va dans les deux sens6 Puis l'on modifie p_ppour que l'lment qui le suit soit celui nouvellement cr et rciproquement7 Etat de la liste aprs l'appel de la fonction

    Le code est lgrement diffrent du fait de l'absence de la structure d'encapsulation.

    void dll_insert (dll_s ** pp_dll, void*data)

    {

    if (pp_dll !=NULL)

    {

    /* (2) */

    dll_s *p_p =*pp_dll;

    dll_s *p_l =NULL;

    dll_s *p_n =NULL;

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    7/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 7 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    /* (3) */

    if (p_p !=NULL)

    p_n = p_p->next;

    /* (4) */p_l = malloc (sizeof (*p_l));

    if (p_l !=NULL)

    {

    p_l->data = data;

    /* (5) */

    p_l->next = p_n;

    if (p_n !=NULL)

    p_n->prev = p_l;

    /* (6) */

    p_l->prev = p_p;

    if (p_p !=NULL)

    p_p->next = p_l;

    *pp_dll = p_l;

    }

    else

    {

    fprintf (stderr, "Memoire insuffisante\n");

    exit (EXIT_FAILURE);

    }

    }

    }

    III-D - Suppression d'un lment

    Voici la fonction qui va subir le plus de modifications, elle va ainsi pouvoir supprimer l'lment passer en paramtre.

    Figure 3 : reprsentation de la suppression d'un lment.

    1 Voici l'tat de la liste avant l'appel de la fonction

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    8/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 8 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    2 Le pointeur p_lreprsente l'argument de la fonction et donc l'lment supprimer3 Sauvegarde de l'lment prcdent celui supprimer grce au pointeur p_p4 Sauvegarde de l'lment suivant celui supprimer grce au pointeur p_n5 Modification des pointeurs de telle manire que le maillon supprimer ne soit plus rfrenc6 Libration de la mmoire7 tat de la liste aprs l'appel de la fonction

    void dll_remove (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    {

    /* (2) */

    dll_s *p_l =*pp_dll;

    /* (3) */

    dll_s *p_p = p_l->prev;

    /* (4) */

    dll_s *p_n = p_l->next;

    /* (5) */

    if (p_p !=NULL)

    p_p->next = p_n;

    if (p_n !=NULL)

    p_n->prev = p_p;

    /* (6) */

    free (p_l);

    p_l =NULL;

    if (p_n !=NULL)

    *pp_dll = p_n;

    else

    *pp_dll = p_p;

    }

    }

    III-E - Accs l'lment prcdent

    Cette fonction se contente de dplacer le pointeur sur l'lment qui prcdent, en faisant tout de mme attention la valeur de pp_dll:

    void dll_prev (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    *pp_dll = (*pp_dll)->prev;

    }

    III-F - Accs au premier lment

    Avec l'apparition du pointeur sur l'lment prcdent, la sentinelle qui reprait le premier lment de la liste n'existeplus, ce qui a permis de simplifier certaines fonctions, cependant il faut retrouver ce premier lment de la mmemanire que le dernier lment.

    void dll_first (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    {

    while ((*pp_dll)->prev !=NULL)

    dll_prev (pp_dll);

    }

    }

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    9/16

  • 8/3/2019 Les listes doublement chanes en C

    10/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 10 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    IV - Conclusion

    Comme pour les listes simplement chanes, si vous cherchez d'autres fonctions, il y a celles de la glib. Maintenantque nous avons fait le tour des listes chanes, les deux prochains articles porteront sur des cas particuliers de listechanes : les piles et les files.

    http://nicolasj.developpez.com/articles/listedouble/http://developer.gnome.org/doc/API/2.0/glib/index.htmlhttp://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    11/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 11 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    V - Autres documentations

    Liste doublement chane par CGI

    http://nicolasj.developpez.com/articles/listedouble/http://chgi.developpez.com/dblist/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    12/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 12 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    VI - Remerciements

    Merci Anomaly pour sa relecture attentive de cet article.

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    13/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 13 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    VII - Code source complet

    Les exemples d'utilisation des listes doublements chanes ne manquent pas puisqu'elles sont prsentes dans lesentrailles des systmes d'exploitation (pour la gestion de la mmoire) jusqu'aux applications courantes (pour le trides donnes par exemple). Tlchargez l'archive zippe.

    listedouble.h#ifndef H_LISTEDOUBLE

    #define H_LISTEDOUBLE

    #include /* pour size_t */

    typedefstruct dll dll_s;

    dll_s *dll_new (void);

    void dll_insert (dll_s **, void*);

    void dll_remove (dll_s **);

    void dll_prev (dll_s **);

    void dll_next (dll_s **);

    void*dll_data (dll_s *);

    void dll_first (dll_s **);

    void dll_last (dll_s **);

    size_t dll_sizeof (dll_s *);

    void dll_delete (dll_s **);

    #endif/* not H_LISTEDOUBLE */

    listedouble.c#include

    #include

    #include "listedouble.h"

    struct dll

    {

    struct dll *prev;

    struct dll *next;

    void*data;

    };

    dll_s *dll_new (void)

    {

    return (NULL);

    }

    void dll_insert (dll_s ** pp_dll, void*data)

    {

    if (pp_dll !=NULL)

    {

    dll_s *p_p =*pp_dll;

    dll_s *p_l =NULL;

    dll_s *p_n =NULL;

    if (p_p !=NULL)

    p_n = p_p->next;

    p_l = malloc (sizeof (*p_l));

    if (p_l !=NULL)

    {

    p_l->data = data;

    p_l->next = p_n;

    if (p_n !=NULL)

    p_n->prev = p_l;

    p_l->prev = p_p; if (p_p !=NULL)

    p_p->next = p_l;

    http://nicolasj.developpez.com/articles/listedouble/ftp://www.ftp-developpez.com/nicolasj/listedouble.ziphttp://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    14/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 14 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    listedouble.c *pp_dll = p_l;

    }

    else {

    fprintf (stderr, "Memoire insuffisante\n");

    exit (EXIT_FAILURE);

    }

    }

    }

    void dll_remove (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    {

    dll_s *p_l =*pp_dll;

    dll_s *p_p = p_l->prev;

    dll_s *p_n = p_l->next;

    if (p_p !=NULL)

    p_p->next = p_n;

    if (p_n !=NULL)

    p_n->prev = p_p;

    free (p_l);

    p_l =NULL;

    if (p_n !=NULL)

    *pp_dll = p_n;

    else

    *pp_dll = p_p;

    }

    }

    void dll_next (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL) *pp_dll = (*pp_dll)->next;

    }

    void dll_prev (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    *pp_dll = (*pp_dll)->prev;

    }

    void*dll_data (dll_s * p_dll)

    {

    return ((p_dll !=NULL) ? p_dll->data : NULL);

    }

    void dll_first (dll_s ** pp_dll){

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    {

    while ((*pp_dll)->prev !=NULL)

    dll_prev (pp_dll);

    }

    }

    void dll_last (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    {

    while ((*pp_dll)->next !=NULL)

    dll_next (pp_dll);

    }

    }

    size_t dll_sizeof (dll_s * p_dll)

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    15/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 15 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation deces sources constitue une oeuvre intellectuelle protge par les droits d'auteurs. Copyright 2005-2007 - Nicolas Joseph. Aucune reproduction,mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse del'auteur. Sinon vous encourez selon la loi jusqu' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.

    http://nicolasj.developpez.com/articles/listedouble/

    listedouble.c{

    size_t n =0;

    if (p_dll !=NULL)

    {

    dll_first (&p_dll);

    while (p_dll !=NULL)

    {

    n++;

    dll_next (&p_dll);

    }

    }

    return (n);

    }

    void dll_delete (dll_s ** pp_dll)

    {

    if (pp_dll !=NULL&&*pp_dll !=NULL)

    {

    dll_first (pp_dll);

    while (*pp_dll !=NULL)

    dll_remove (pp_dll);

    }

    }

    http://nicolasj.developpez.com/articles/listedouble/http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072
  • 8/3/2019 Les listes doublement chanes en C

    16/16

    Les listes doublement chanes en C par Nicolas Joseph (home) (Blog)

    - 16 -Les sources prsents sur cette pages sont libres de droits, et vous pouvez les utiliser votre convenance. Par contre la page de prsentation de

    http://nicolasj.developpez.com/articles/listedouble/http://blog.developpez.com/?blog=58http://nicolasj.developpez.com/http://www.developpez.net/forums/member.php?u=41072