begin process at 2012 02 10 03:04:01
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > UNE LISTE DOUBLEMENT CHAINEE, CIRCULAIRE ET TEMPLATES

UNE LISTE DOUBLEMENT CHAINEE, CIRCULAIRE ET TEMPLATES


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :10 259

Auteur : turnerom

Ecrire un message privé
Site perso
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é

 Sources du même auteur

Source avec Zip FAST BASE64 / UUENCODING ENCODAGE/DECODAGE
Source avec Zip LIBCONNECT - BIBLIOTHÈQUE C++ DE CONNEXION
CONVERTIR UNE STRING EN N'IMPORTE QUOI
Source avec Zip UN JUKEBOX POUR LINUX
Source avec Zip BIBLIOTHÈQUE PERMETTANT D'UTILISER LES SOCKETS DE MANIÈRE TR...

 Sources de la même categorie

Source avec Zip ÉDITEUR DE RECTANGLES EN CONSOLE par seoseo
CONVERSION DE FICHIER EN FICHIER BMP par seoseo
Source avec Zip DETECTEUR EJP par idpro
Source avec Zip Source avec une capture SHOP MANAGER CONSOLE SUR WINDOWS par antho974
Source avec Zip JOUR DE NAISSANCE par fredg19

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LISTE DOUBLEMENT CHAINÉE par Slyders
BUFFER CIRCULAIRE par dadamagouil
LISTE CHAINÉE (TEMPLATE, NOEUD LOCAL OU GLOBAL, INSERTION OU... par darkpoulpo
Source avec Zip Source avec une capture LISTE CHAÎNÉE ORIENTÉE OBJET, BASÉE SUR LES TEMPLATES par exar
Source avec Zip CLASSE CLISTE par bobbyantho

Commentaires et avis

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...

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.

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?

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()

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.

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?

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 !!!

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 ;-) )

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

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

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 !

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,387 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales