Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

UNE LISTE DOUBLEMENT CHAINEE, CIRCULAIRE ET TEMPLATES


Information sur la source

Catégorie :Divers Classé sous : liste, chaine, circulaire, buffer, template Niveau : Initié Date de création : 11/05/2006 Date de mise à jour : 17/01/2007 16:29:11 Vu : 7 383

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

Description

Une liste doublement chainée circulaire avec 1 pointeur sur le début, 1 pointeur sur la fin et 2 autres pointeurs permettant de ce promener dans la liste.
Pourquoi avoir rajouter ces 2 pointeurs ? J'en avais besoin donc je les ai implémentés, supprimez les si vous n'en avez pas besoin (ce qui est le cas la plupart du temps je pense).
 

Source

  • #ifndef CHAIN_H
  • #define CHAIN_H
  • #include <iostream>
  • using namespace std;
  • enum{FREE,WORKING};
  • template <class T>
  • class Chain
  • {
  • public:
  • class Maillon;
  • private:
  • int nbMaillons;
  • Maillon* deb;
  • Maillon* fin;
  • public:
  • Maillon* ptrw;
  • Maillon* ptrr;
  • Chain();
  • void ajouterEnFin(T chaine);
  • void ajouterEnDeb(T chaine);
  • void retirerEnFin();
  • void retirerEnDeb();
  • void getNextr();
  • void getPrecr();
  • void getNextw();
  • void getPrecw();
  • int nbElem();
  • void vider();
  • Chain(const Chain & d);
  • void afficher();
  • };
  • template <class T>
  • struct Chain<T>::Maillon
  • {
  • Maillon* suiv;
  • Maillon* prec;
  • T data;
  • bool state;
  • Maillon(T chaine);
  • T getData();
  • void setData(T chaine);
  • bool getState();
  • void setState(bool newstate);
  • };
  • template<class T>
  • Chain<T>::Chain() : deb(0), fin(0)
  • {
  • nbMaillons=0;
  • }
  • template<class T>
  • void Chain<T>::ajouterEnFin(T chaine)
  • {
  • Maillon *nouv=new Maillon(chaine);
  • if(nbMaillons==0)
  • {
  • fin=nouv;
  • ptrr=ptrw=deb=nouv;
  • nouv->prec=nouv;
  • nouv->suiv=nouv;
  • }
  • else
  • {
  • fin->suiv=nouv;
  • deb->prec=nouv;
  • nouv->prec=fin;
  • nouv->suiv=deb;
  • fin=nouv;
  • }
  • nbMaillons++;
  • }
  • template<class T>
  • void Chain<T>::ajouterEnDeb(T chaine)
  • {
  • Maillon *nouv=new Maillon(chaine);
  • if(nbMaillons==0)
  • {
  • ptrr=ptrw=deb=nouv;
  • fin=nouv;
  • nouv->prec=nouv;
  • nouv->suiv=nouv;
  • }
  • else
  • {
  • fin->suiv=nouv;
  • deb->prec=nouv;
  • nouv->suiv=deb;
  • nouv->prec=fin;
  • ptrr=ptrw=deb=nouv;
  • }
  • nbMaillons++;
  • }
  • template<class T>
  • void Chain<T>::retirerEnFin()
  • {
  • if(nbMaillons!=0)
  • {
  • if(nbMaillons>1)
  • {
  • fin=fin->prec;
  • delete fin->suiv;
  • fin->suiv=deb;
  • deb->prec=fin;
  • }
  • else
  • delete fin;
  • nbMaillons--;
  • }
  • }
  • template<class T>
  • void Chain<T>::retirerEnDeb()
  • {
  • if(nbMaillons!=0)
  • {
  • if(nbMaillons>1)
  • {
  • ptrr=ptrw=deb=deb->suiv;
  • delete deb->prec;
  • deb->prec=fin;
  • fin->suiv=deb;
  • }
  • else
  • delete deb;
  • nbMaillons--;
  • }
  • }
  • template<class T>
  • void Chain<T>::getNextr()
  • {
  • ptrr=ptrr->suiv;
  • }
  • template<class T>
  • void Chain<T>::getNextw()
  • {
  • ptrw=ptrw->suiv;
  • }
  • template<class T>
  • void Chain<T>::getPrecr()
  • {
  • ptrr=ptrr->prec;
  • }
  • template<class T>
  • void Chain<T>::getPrecw()
  • {
  • ptrw=ptrw->prec;
  • }
  • template<class T>
  • int Chain<T>::nbElem()
  • {
  • return nbMaillons;
  • }
  • template<class T>
  • void Chain<T>::vider()
  • {
  • for( ;nbMaillons!=1;nbMaillons--)
  • {
  • fin=fin->prec;
  • delete fin->suiv;
  • }
  • delete fin;
  • nbMaillons--;
  • }
  • template<class T>
  • Chain<T>::Chain(const Chain & d)
  • {
  • Maillon* tmp=d.deb;
  • nbMaillons=0;
  • if(d.nbMaillons==0)
  • return;
  • Maillon* n=new Maillon(tmp->data);
  • nbMaillons++;
  • deb=n;
  • fin=n;
  • for(int i=1; i<d.nbMaillons;i++)
  • {
  • tmp=tmp->suiv;
  • ajouterEnFin(tmp->data);
  • }
  • }
  • template<class T>
  • void Chain<T>::afficher()
  • {
  • Maillon* temp=deb;
  • if(nbMaillons==0)
  • {
  • cout << "Empty chain" << endl;
  • return ;
  • }
  • for(int i=0; i<nbMaillons-1; i++)
  • {
  • cout << temp->data << " -> " ;
  • temp=temp->suiv;
  • }
  • cout << temp->data << endl;
  • }
  • /******************************************************************************/
  • template<class T>
  • Chain<T>::Maillon::Maillon(T chaine)
  • : suiv(0), prec(0)
  • {
  • state=FREE;
  • data=chaine;
  • }
  • template<class T>
  • T Chain<T>::Maillon::getData()
  • {
  • return data;
  • }
  • template<class T>
  • void Chain<T>::Maillon::setData(T chaine)
  • {
  • data=chaine;
  • }
  • template<class T>
  • bool Chain<T>::Maillon::getState()
  • {
  • return state;
  • }
  • template<class T>
  • void Chain<T>::Maillon::setState(bool newstate)
  • {
  • state=newstate;
  • }
  • #endif
  • _______________________________________________________
  • //Un petit exemple d'utilisation
  • #include "chain.h"
  • #include <iostream>
  • using namespace std;
  • int main()
  • {
  • char* c="Hello";
  • Chain<char*> d;
  • d.ajouterEnDeb(c);
  • d.ajouterEnFin("world");
  • d.ajouterEnFin("!!!");
  • d.deb->setData("coucou");
  • d.getNextr();
  • d.ptrr->setState(WORKING);
  • cout << d.ptrr->getState() << endl;
  • d.retirerEnDeb();
  • d.retirerEnFin();
  • d.retirerEnDeb();
  • d.retirerEnDeb();
  • d.afficher();
  • Chain<char*> d2(d);
  • d2.afficher();
  • return 0;
  • }
#ifndef CHAIN_H
#define CHAIN_H

#include <iostream>

using namespace std;

enum{FREE,WORKING};


template <class T>
class Chain
{
public:
    class Maillon;

private:
    int nbMaillons;
    Maillon* deb;
    Maillon* fin;


public:
    Maillon* ptrw;
    Maillon* ptrr;


    Chain();

    void ajouterEnFin(T chaine);
    void ajouterEnDeb(T chaine);
    void retirerEnFin();
    void retirerEnDeb();

    void getNextr();
    void getPrecr();
    void getNextw();
    void getPrecw();


    int nbElem();
    void vider();
    Chain(const Chain & d);
    void afficher();
};


template <class T>
struct Chain<T>::Maillon
{
    Maillon* suiv;
    Maillon* prec;
    T  data;
    bool state;

    Maillon(T chaine);
    T getData();
    void setData(T chaine);
    bool getState();
    void setState(bool newstate);
};


template<class T>
Chain<T>::Chain() : deb(0), fin(0)
{
    nbMaillons=0;
}


template<class T>
void Chain<T>::ajouterEnFin(T chaine)
{

    Maillon *nouv=new Maillon(chaine);

    if(nbMaillons==0)
    {
        fin=nouv;
        ptrr=ptrw=deb=nouv;
        nouv->prec=nouv;
        nouv->suiv=nouv;
    }
    else
    {
        fin->suiv=nouv;
        deb->prec=nouv;
        nouv->prec=fin;
        nouv->suiv=deb;

        fin=nouv;
    }
    nbMaillons++;

}

template<class T>
void Chain<T>::ajouterEnDeb(T chaine)
{
    Maillon *nouv=new Maillon(chaine);

    if(nbMaillons==0)
    {
        ptrr=ptrw=deb=nouv;
        fin=nouv;
        nouv->prec=nouv;
        nouv->suiv=nouv;
    }
    else
    {
        fin->suiv=nouv;
        deb->prec=nouv;
        nouv->suiv=deb;
        nouv->prec=fin;

        ptrr=ptrw=deb=nouv;
    }
    nbMaillons++;
}


template<class T>
void Chain<T>::retirerEnFin()
{
    if(nbMaillons!=0)
    {
        if(nbMaillons>1)
        {
            fin=fin->prec;
            delete fin->suiv;

            fin->suiv=deb;
            deb->prec=fin;
        }
        else
            delete fin;

        nbMaillons--;
    }
}


template<class T>
void Chain<T>::retirerEnDeb()
{
    if(nbMaillons!=0)
    {
        if(nbMaillons>1)
        {
            ptrr=ptrw=deb=deb->suiv;
            delete deb->prec;

            deb->prec=fin;
            fin->suiv=deb;
        }
        else
            delete deb;


        nbMaillons--;
    }
}


template<class T>
void Chain<T>::getNextr()
{
    ptrr=ptrr->suiv;
}


template<class T>
void Chain<T>::getNextw()
{
    ptrw=ptrw->suiv;
}


template<class T>
void Chain<T>::getPrecr()
{
    ptrr=ptrr->prec;
}

template<class T>
void Chain<T>::getPrecw()
{
    ptrw=ptrw->prec;
}


template<class T>
int Chain<T>::nbElem()
{
    return nbMaillons;
}


template<class T>
void Chain<T>::vider()
{
    for( ;nbMaillons!=1;nbMaillons--)
    {
        fin=fin->prec;
        delete fin->suiv;
    }
    delete fin;
    nbMaillons--;
}


template<class T>
Chain<T>::Chain(const Chain & d)
{
    Maillon* tmp=d.deb;
    nbMaillons=0;

    if(d.nbMaillons==0)
        return;

    Maillon* n=new Maillon(tmp->data);
    nbMaillons++;
    deb=n;
    fin=n;

    for(int i=1; i<d.nbMaillons;i++)
    {
        tmp=tmp->suiv;

        ajouterEnFin(tmp->data);
    }

}


template<class T>
void Chain<T>::afficher()
{
    Maillon* temp=deb;

    if(nbMaillons==0)
    {
        cout << "Empty chain" << endl;
        return ;
    }

    for(int i=0; i<nbMaillons-1; i++)
    {

        cout << temp->data << " -> " ;
        temp=temp->suiv;
    }

    cout << temp->data << endl;
}


/******************************************************************************/

template<class T>
Chain<T>::Maillon::Maillon(T chaine)
        : suiv(0), prec(0)
{
    state=FREE;
    data=chaine;
}


template<class T>
T Chain<T>::Maillon::getData()
{
    return data;
}


template<class T>
void Chain<T>::Maillon::setData(T chaine)
{
    data=chaine;
}


template<class T>
bool Chain<T>::Maillon::getState()
{
    return state;
}


template<class T>
void Chain<T>::Maillon::setState(bool newstate)
{
    state=newstate;
}


#endif


_______________________________________________________
//Un petit exemple d'utilisation

#include "chain.h"

#include <iostream>

using namespace std;
int main()
{
    char* c="Hello";
    
    Chain<char*> d;
    
    d.ajouterEnDeb(c);
    d.ajouterEnFin("world");
    d.ajouterEnFin("!!!");
    d.deb->setData("coucou");
    
    d.getNextr();
    d.ptrr->setState(WORKING);
    cout <<  d.ptrr->getState() << endl;
    
    d.retirerEnDeb();
    d.retirerEnFin();
    d.retirerEnDeb();
    d.retirerEnDeb();
    
    
    
    d.afficher();
    
    Chain<char*> d2(d);
    d2.afficher();
    
    return 0;
}



Conclusion

Cette source n'est pas (trop) commentée, mais je pense qu'elle est assez simple. Demandez-moi si vous ne comprenez pas quelquechose.

Je savais pas trop dans quelle catégorie mettre cette source. Si vous trouvez une meilleure place, dites le moi!
 

Historique

11 mai 2006 09:37:09 :
Correction de fotes d'ortografes ;D
26 juin 2006 18:10:56 :
Correction de bug
17 janvier 2007 16:29:12 :
rajout de "};" à la ligne 45, petit oubli désolé

Commentaires et avis

signaler à un administrateur
Commentaire de exar le 14/05/2006 14:08:00

Pas mal.  C'est vrai que c'est assez simple et clair.
Juste une petite remarque: dans l'interface, tu déclares Maillon comme une class et tu l'implémentes comme une struct.
Et je n'ai pas non plus trouvé de destructeur...

signaler à un administrateur
Commentaire de turnerom le 15/05/2006 08:55:15

Une class, une struct, c'est + ou - la meme chose.
Quant au destructeur, celui par défaut suffit, donc pas la peine dans mettre un.

signaler à un administrateur
Commentaire de errikke le 15/05/2006 22:13:30

Est tu bien sûr que le destructeur ne serve à rien dans la
mesure ou les membres de la classe sont des pointeurs?

signaler à un administrateur
Commentaire de turnerom le 15/05/2006 22:34:27

Les maillons sont détruit dans ces méthodes de la classe Chain :

void Chain<T>::retirerEnFin()
void Chain<T>::retirerEnDeb()
void Chain<T>::vider()

signaler à un administrateur
Commentaire de econs le 18/05/2006 10:59:51 administrateur CS

Salut,

La catégorie DIVERS, c'est pas un mauvais choix.
Le code a le mérite d'être clair, facile à comprendre.

Dans ton exemple, tu devrais jouer un peu sur le côté générique du code, en déclarant également des variables du type :

Chain<int*> d1;
Chain<unsigned short*> d2;
[...]

Ceci afin de montrer qu'avec un seul code, on fait plusieurs choses.

signaler à un administrateur
Commentaire de flipper2004 le 26/06/2006 16:31:56

Bonjour, j ai visual 2005 v8.xxx et j arrive pas a compiler le code, j ai : "end of file found before the left brace '{' at.... line 13" et effectivement l'acolade de la ligne 13 n est jamais fermee, si je la ferme a la ligne 45, j ai une autre erreur : 'Chain<T>::deb' : cannot access private member declared in class 'Chain<T>'.
Pouvez vous m aider?

signaler à un administrateur
Commentaire de turnerom le 26/06/2006 18:12:50

Voila, la source est mise a jour et fonctionne pu***n de copier/coller :D.

Sinon à part voir + ou - comment fonctionne les listes chainées, cette source n'a pas grand intêret car ce que fait ce programme la classe vector de la STL le fait bien mieux !!!

signaler à un administrateur
Commentaire de flipper2004 le 26/06/2006 18:46:49

ok, merci pour l info, j etais justement parti voir la classe list de STL (plutot que vector ;-) )

signaler à un administrateur
Commentaire de flipper2004 le 29/08/2006 14:57:05

Bon, finalement j ai perdu ce que j avais fait et je voulais recuperer ta liste chainee mais le source n'a pas l'air d'être mis à jour, pourrais tu m indiquer ou ajouter le "};" pour fermer la classe Chain, car lorsque je la met ligne 45, ca pose probleme après dans ton main pour le d.deb->setData("coucou");, il y a un probleme d'acces a un membre privé

Merci de ton aide

signaler à un administrateur
Commentaire de breakdancer97170 le 13/11/2007 19:44:16

slt
dis moi qu'est ce que signifie les variables:

ptrr

ptrw

Au plaisir de te relire.
ps: je sais que ce sont des points, mais aurais tu un nom plus explicite pour eux. MErci d'avance

signaler à un administrateur
Commentaire de exar le 13/11/2007 20:03:07

Turnerom: en fait, struct et class sont identiques à un détail près: la visibilité.  Par défaut, tout est public dans une struct, alors que c'est private dans une class.
Econs: c'est certain mais le plus gros du boulot est fait.  Il y a moyen facilement de gérer n'importe quel type, même de nouvelles classes, ... en utilisant les traits et les allocateurs.  voir http://www.cppfrance.com/codes/UTILISATION-TECHNIQUE-TRAITS_37173.aspx

A++ et bon coding !

signaler à un administrateur
Commentaire de mira2 le 07/03/2008 14:07:42

j'ai besoin des listes circulaires mais je ne sais que le C, je ne sais ni le java ni le C++, pouvez vous m'aidez ???

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Liste chainée en C++ sans STL (ni vector ni template) [ par Tamahome ] Bonjour,je cherche un exemple de liste chainée (sans STL: ni vector ni template) enC++ (pas en C) permettant de chainer des objets héterogenes (par ex Help urgent !! liste doublement chainée [ par arthur007 ] Bonjour à touspuisuqe je suis un débutant dans la programmation C, j'ai besoin de votre aide.j'ai 2 structures: typedef struct Comp{int Code; char Nom base de donnee / ado / et liste chaine [ par callaghan1981 ] hello a ts..j ai un petit bleme..jarrive a me connecter a une base de donne, de consulter la baseet je desire now mettre tt les champs dune table ou r liste circulaire avec la classe <list> [ par maincpp ] Aidez moi svp !!!! je voudrai savoir si on peut modeliser une liste circulaire avec la classe &lt;list&gt; Tableaux dynamique ou liste chainée ? [ par tintin72 ] Bonjour,J'ai &#233;cris une petite&nbsp;fonction qui permet d'allouer de la memoire pour cr&#233;er&nbsp;des tableaux dynamique.exemple pour un tablea probleme de liste chaine [ par cutibipoulet ] voila, ge d&#233;bute en cpp et iles probl&#232;mes commences quand je fait une simple liste doublement chain&#233;. JeDans cette liste, il existe und rechercher chaine de caractere dans texte [ par melkiorlenecrarque ] Bonjour! Je dois rechercher une chaine de caractere dans un buffer, Quelle est la maniere la plus optimis&#233;e, sachant que je programme avec les a regler la taille d'une chaine de caractere en fontion d'une int [ par shadow1779 ] Bonjour, je cherche a faire un ptit systeme pour mettre un gros fichiers en partie, pour cela j'utilise une chaine de caractere qui me sert de tampon tableau [ par blueburry ] bonjour,je suis en train de retirer une chaine de caracteres et de la stocker ds un buffer.je voudrais savoir quelle instruction utiliser (en visual C couleur d'un texte dans un buffer [ par dams6478 ] bonjour, voila je voudrai modifier la couleur d'un texte que j'insere dans un buffer texte voila la commande que j'utilise pour inserrer ce texte: gt


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,671 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.