begin process at 2012 05 27 18:27:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > LISTE CHAÎNÉE ORIENTÉE OBJET, BASÉE SUR LES TEMPLATES

LISTE CHAÎNÉE ORIENTÉE OBJET, BASÉE SUR LES TEMPLATES


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :liste, chainée, template Niveau :Débutant Date de création :23/11/2006 Date de mise à jour :23/11/2006 22:51:02 Vu / téléchargé :4 347 / 1 713

Auteur : exar

Ecrire un message privé
Site perso
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ayant déjà vu plein de listes chaînées postées ici, parfois bizzares dans leur développement, je me suis décidé à en développer une un peu plus évoluée...

Cette liste chaînée est entièrement orientée objet.

Elle utilise la technique des traits (voir mon précédent post http://www.cppfrance.com/codes/UTILISATION-TECHNIQ UE-TRAITS_37173.aspx)

La liste contient un noeud de début, vide, et un noeud de fin, également vide.
Les données sont stockées dans des noeuds internes.
Chaque classe de noeud descend d'une classe abstraite Noeud:

                ------------------
                |      Noeud     |
------------------
                         |
                         |
      --------------------------------------
      |                  |                 |
     \/                 \/                \/
--------------    ----------------    ------------
| NoeudDebut |    | NoeudInterne |    | NoeudFin |
--------------    ----------------    ------------

La liste délègue ses actions aux noeuds (stockage, affichage).

Pour stocker les valeurs dans les noeuds internes, j'ai créé une classe template Donnee.

Voici comment cela se passe:

* Création de la liste:

-----------------------
|   Liste chainée     |
-----------------------           ------------------
| _debut (NoeudDebut) |---------->| Objet NoeudFin |
-----------------------           ------------------

* Après insertion d'un élément:

---------------------
|   Liste chainée   |
---------------------           -----------------
| _debut            |---------->| Noeud interne |
---------------------           -----------------       ------------------
                                | _suivant |------>| Objet NoeudFin |
                                -----------------       ------------------


Et ainsi de suite.  Suivant le résultat de la comparaison effectuée sur les données en début d'insertion, le noeud interne sera inséré avant ou après le noeud courant (avant pour une donnée plus grande ou égale, après pour une donnée plus petite).

Chaque noeud interne pointe sur un objet de type Donnee:

-----------------
| Noeud interne |
-----------------       ----------------
| _donnee |------>| Objet Donnee |
-----------------       ----------------

Donc, en résumé:

---------------------
|   Liste chainée   |
---------------------           -----------------
| _debut     |---------->| Noeud interne |
---------------------           -----------------       ------------------
                                | _suivant |------>| Objet NoeudFin |
                                | _donnee |       ------------------
                                -----------------
                                       |
                                       |
                                      \/
                                ----------------
                                | Objet Donnee |
                                ----------------

Toutes les classes sont basées sur les templates:

Donnee<T, traits=Trait<T> >
Noeud<T>
NoeudDebut<T>
NoeudInterne<T>
Noeud Fin<T>
ListeChainee<T>

Donc, pour déclarer une liste d'entiers: ListeChainee<int> li;
Ensuite, pour insérer, il suffit d'appeler la méthode insere(int donnee) ou insere(const Donnee<int>& donnee).  Le type Donnee est bien sûr instanciable (donc, pour l'exemple: Donnee<int> i(5), par exemple).

ATTENTION: le type Donnee ne contient pas de constructeur par défaut !

Le header traits.h fourni fonctionne pour tous les types de base.  Il est aussi spécialisé pour le type char*.  Il suffit simplement de le modifier et d'ajouter de nouveaux types pour étendre les possibilités de la liste.

Pour la recherche, la suppression, la modification et la suppression, cela reste simple.

Le .zip contient la source pour Dev-C++ et le Makefile pour Linux.  J'ai juste testé sous Win XP et Linux RedHat 9 avec le main.cpp fourni.

Merci de poster vos commentaires, ainsi que les bugs éventuels.

NB: les schémas ne passent apparement pas...  Si vous les voulez, envoyez-moi un message...



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 novembre 2006 22:47:39 :
Les petits schémas de l'explication ne passaient pas convenablement...
23 novembre 2006 22:51:02 :
Les schémas ne passent toujours pas...

 Sources du même auteur

Source avec Zip CLASSE DE DATE LOCALISÉE (20 LANGUES)
Source avec Zip TRACEUR
Source avec Zip UTILISATION DE LA TECHNIQUE DES "TRAITS"

 Sources de la même categorie

Source avec Zip KISIEL CD INFO DRIVE par kisiel0147852
Source avec une capture SUPPRESSION DES REDONDANCES DE FICHIERS par cyberntique
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

 Sources en rapport avec celle ci

LISTE CHAINÉE (TEMPLATE, NOEUD LOCAL OU GLOBAL, INSERTION OU... par darkpoulpo
UNE LISTE DOUBLEMENT CHAINEE, CIRCULAIRE ET TEMPLATES par turnerom
Source avec Zip CLASSE CLISTE par bobbyantho
Source avec Zip LISTE CHAINÉE SUPPORTANT LES TEMPLATES par Zer0 le Her0
LISTE SIMPLEMENT CHAINÉE EN POO par jebaliala

Commentaires et avis

Commentaire de yann_lo_san le 07/12/2006 14:14:33

C'est vrai qu'un code générique est plus dur à comprendre, mais le gain est évident !
Je vais regarder ça de plus près.

 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 liste chainée [ par rastatouin ] en ce qui concerne la liste chainée, quelqu'un aurai un exemple bien expliquer concernant sa creation, l'ajout, la modif, laffiche, le tri svp recherche dans une liste chainée [ par sossouha ] salut, J'ai à faire le recherche d'un caractère dans une liste chainée en langage C. voici la structure que j'utilise typedef struct arc { char va Trier une liste chainée ? [ par tintin72 ] Bonjour,Je voudrais connaitre le principe du trie dans une liste chain&#233;e.Je voudrais par ex trier une liste chain&#233;e qui existe d&#233;j&#224 clonage de liste chainée et suppression [ par avillenave ] Bonjour, Je d&#233;veloppe actuellement en C, un algo de recuit simul&#233; avec un calcul d'entropie J'ai un tableau de liste chain&#233;e B liste chainée: type file d'attente [ par cunbreizh ] MAIDER! MAIDER!Votre texte ICIVotre texte ICIdébutant dans la prog en C. Je cherche à programmer de la manière la plus simple et basic possible une st Du remord pour vector [ par guifr ] Bonjour &#224; tous, Dans une application je dois utiliser des tableaux dynamiques. Ma premi&#232;re id&#233;e &#233;tait de cr&#233;er des listes ch [LangageC]Tri d'une liste chainée d'entiers. [ par sleyze ] Bonsoir, quelqu'un pourrait il me donner une fonction permettant de trier une liste chain&#233;e L dans l'ordre croissant en utilisant un tri autre qu template- au secours [ par toddy_101 ] bonjour tout le monde, j'ai un probleme au niveau des templates, ca bloke au niveau du linkage!! voici la declaration de la classe , et des methodes: [Urgent] Fonction à liste chainée [ par zalpa ] Bon voila, je suis un etudiant en 1ere ann&#233;e Informatique appliqu&#233


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,608 sec (3)

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