begin process at 2012 05 27 19:59:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > IMPLEMENTATION STL (LIST)

IMPLEMENTATION STL (LIST)


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :stl, list, class Niveau :Débutant Date de création :06/09/2005 Date de mise à jour :07/09/2005 13:30:31 Vu :7 517

Auteur : Taron31

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

 Description

Salout,
J'ai codé récemment une toute petite implementation de la fonctionnalite LIST de la STL, c'est tres simple...
J'ai implemente une classe "List" pour cela, et j'ai defini la plupart des fonctions appropriées au fonctionnement d'une liste, voici la liste :
- push_front()
- push_back()
- pop_front()
- pop_back()
- remove()
- begin()
- end()

Il sufit alors d'instancier un objet de la classe List, et de fare appel aux methodes membres pour effectuer des operations (comme pour rajouter un element au debut de la liste, ou a la fin, en supprimer, obtenir le pointeur de tete, etc...)

Source

  • // Implémentation de la List
  • /* List.h : class for double linked list */
  • /* Writed by Taron_ -> GPL attitude ;) */
  • #ifndef _LIST_H_
  • #define _LIST_H_
  • #include <iostream>
  • using namespace std;
  • /* Types of errors */
  • #define ERROR_ALLOCATE_HEAP 1
  • #define ERROR_FREE_HEAP 2
  • #define OK 0
  • /* Class declaration */
  • template <typename T>
  • class List
  • {
  • private:
  • struct Link // Struct for linked list
  • {
  • T Value; // Value of new object
  • Link *Next;
  • Link *Prev;
  • };
  • typedef struct Link Link;
  • Link *End;
  • public:
  • List(); /* Constructor & Destructor */
  • ~List();
  • friend ostream& operator<<(ostream&, List<T>);
  • int push_front(T); /* Insert a element */
  • int push_back(T);
  • void pop_front(); /* Delete a element */
  • void pop_back();
  • void remove(T);
  • Link* begin(); /* Get address for begin and end of list */
  • Link* end();
  • Link *Temp, *Head;
  • };
  • template <typename T>
  • ostream& operator<<(ostream& Out, List<T> L)
  • {
  • L.Temp = 0;
  • if(L.Head->Value == 0) L.Temp = L.Head->Next;
  • else L.Temp = L.Head;
  • /* Display all object */
  • for(; L.Temp != 0 ; L.Temp = L.Temp->Next)
  • cout << L.Temp->Value << endl;
  • return Out;
  • }
  • template <typename T>
  • List<T>::List() /* Constructor */
  • {
  • Head = (Link *)malloc(sizeof(Link)); /* Prepare the list */
  • Head->Next = 0;
  • Head->Prev = 0;
  • Head->Value = 0;
  • End = Head;
  • }
  • template <typename T>
  • List<T>::~List() // Destructor
  • {
  • Temp = 0;
  • if(Head->Value == 0) Temp = Head->Next;
  • else Temp = Head;
  • for(; Temp != 0 ; Temp = Temp->Next);
  • // free(Temp);
  • }
  • template <typename T>
  • int List<T>::push_front(T Value) /* Add a value front of the list */
  • {
  • Link *New = 0;
  • New = (Link *)malloc(sizeof(Link));
  • if(Head->Value != 0)
  • {
  • if(!New) return ERROR_ALLOCATE_HEAP; // Can't allocate heap memory !
  • New->Next = Head;
  • New->Prev = 0;
  • Head->Prev = New;
  • New->Value = Value;
  • Head = New; // Update of new Head
  • }
  • else Head->Value = Value;
  • return OK;
  • }
  • template <typename T>
  • int List<T>::push_back(T Value) /* Add a value at the end of the list */
  • {
  • Temp = 0;
  • Link *New = 0;
  • if(Head->Next != 0)
  • {
  • for(Temp = Head ; Temp->Next != 0 ; Temp = Temp->Next);
  • }
  • else Temp = Head;
  • New = (Link *)malloc(sizeof(Link)); // Allocate memory for new object
  • if(!New) return ERROR_ALLOCATE_HEAP; // Can't allocate heap memory !
  • Temp->Next = New;
  • New->Prev = Temp; /* Insert into list */
  • New->Next = 0;
  • New->Value = Value;
  • End = New;
  • return OK;
  • }
  • template <typename T>
  • void List<T>::pop_front() /* Delete the first element of the list */
  • {
  • Temp = Head;
  • Head = Head->Next;
  • free(Temp); // Be free
  • }
  • template <typename T>
  • void List<T>::pop_back() /* Delete the last element of the list */
  • {
  • Temp = 0;
  • for(Temp = Head ; Temp->Next != 0 ; Temp = Temp->Next);
  • Temp->Prev->Next = 0;
  • free(Temp); // Free
  • }
  • template <typename T>
  • void List<T>::remove(T Value)
  • {
  • if(Head->Value == 0) Temp = Head->Next;
  • else Temp = Head;
  • Link *Copy = 0;
  • /* Moving in the list */
  • for(; Temp != 0 ; Temp = Temp->Next)
  • if(Temp->Value == Value)
  • {
  • Copy = Temp->Prev;
  • if(Temp->Prev != 0)
  • Temp->Prev->Next = Temp->Next;
  • if(Temp->Next != 0)
  • Temp->Next->Prev = Temp->Prev;
  • free(Temp);
  • Temp = Copy;
  • }
  • }
  • template <typename T>
  • List<T>::Link* List<T>::begin()
  • {
  • return Head; // Return head of the list
  • }
  • template <typename T>
  • List<T>::Link* List<T>::end()
  • {
  • return End; // Return end of the list
  • }
  • #endif
  • // voici un court exemple d'utilisation
  • #include <iostream>
  • #include "List.h"
  • using namespace std;
  • int main()
  • {
  • List<char> l;
  • l.push_back('z');
  • l.push_back('p');
  • l.push_front('r');
  • l.push_back('b');
  • l.push_front('p');
  • l.push_back('i');
  • l.push_front('p');
  • l.push_back('u');
  • l.push_back('p');
  • cout << l << endl;
  • l.remove('p');
  • cout << l << endl;
  • l.pop_front();
  • l.pop_back();
  • return 0;
  • }
// Implémentation de la List

/* List.h : class for double linked list */
/* Writed by Taron_ -> GPL attitude ;) */

#ifndef _LIST_H_
#define _LIST_H_

#include <iostream>
using namespace std;

/* Types of errors */
#define ERROR_ALLOCATE_HEAP 1
#define ERROR_FREE_HEAP     2

#define OK 0

/* Class declaration */

template <typename T> 
class List
{
 private:
   struct Link   // Struct for linked list
   {
      T Value;   // Value of new object
       
      Link *Next;
      Link *Prev;
   };
          
   typedef struct Link Link;            
   Link *End;   

 public:
   List();   /* Constructor & Destructor */
  ~List();

   friend ostream& operator<<(ostream&, List<T>);

   int push_front(T);  /* Insert a element */
   int push_back(T);
   
   void pop_front();   /* Delete a element */
   void pop_back();
 
   void remove(T);

   Link* begin();   /* Get address for begin and end of list */
   Link* end();

   Link *Temp, *Head;
};

template <typename T>
ostream& operator<<(ostream& Out, List<T> L)
{
   L.Temp = 0;

   if(L.Head->Value == 0) L.Temp = L.Head->Next;
   else L.Temp = L.Head;

   /* Display all object */
   for(; L.Temp != 0 ; L.Temp = L.Temp->Next)
      cout << L.Temp->Value << endl;             

   return Out;
}

template <typename T>
List<T>::List()   /* Constructor */
{
   Head = (Link *)malloc(sizeof(Link));   /* Prepare the list */
  
   Head->Next = 0;
   Head->Prev = 0;
   
   Head->Value = 0;

   End = Head;   
}

template <typename T>
List<T>::~List()   // Destructor
{
   Temp = 0;
   
   if(Head->Value == 0) Temp = Head->Next;
   else Temp = Head;   

   for(; Temp != 0 ; Temp = Temp->Next);
   // free(Temp);
}

template <typename T>
int List<T>::push_front(T Value)   /* Add a value front of the list */
{
   Link *New = 0;
   New = (Link *)malloc(sizeof(Link));

   if(Head->Value != 0)
   {
      if(!New) return ERROR_ALLOCATE_HEAP;   // Can't allocate heap memory !
   
      New->Next = Head;
      New->Prev = 0;
   
      Head->Prev = New;
      New->Value = Value;

      Head = New;   // Update of new Head
   }

   else Head->Value = Value;

   return OK;
}

template <typename T>
int List<T>::push_back(T Value)   /* Add a value at the end of the list */
{
   Temp = 0;
   Link *New = 0;
   
   if(Head->Next != 0)
   {
      for(Temp = Head ; Temp->Next != 0 ; Temp = Temp->Next); 
   }

   else Temp = Head;
   
   New = (Link *)malloc(sizeof(Link));   // Allocate memory for new object
   if(!New) return ERROR_ALLOCATE_HEAP;   // Can't allocate heap memory !

   Temp->Next = New;

   New->Prev = Temp;   /* Insert into list */
   New->Next = 0;

   New->Value = Value;
   End = New;

   return OK;
}

template <typename T>
void List<T>::pop_front()   /* Delete the first element of the list */
{
   Temp = Head;

   Head = Head->Next;
   free(Temp);   // Be free
}

template <typename T>
void List<T>::pop_back()   /* Delete the last element of the list */
{
   Temp = 0;

   for(Temp = Head ; Temp->Next != 0 ; Temp = Temp->Next);
   
   Temp->Prev->Next = 0;
   free(Temp);   // Free
}

template <typename T>
void List<T>::remove(T Value)
{
   if(Head->Value == 0) Temp = Head->Next;
   else Temp = Head;

   Link *Copy = 0;

   /* Moving in the list */
   for(; Temp != 0 ; Temp = Temp->Next)
      if(Temp->Value == Value)
	  {
         Copy = Temp->Prev;
         
		 if(Temp->Prev != 0)
		   Temp->Prev->Next = Temp->Next;
	
		 if(Temp->Next != 0)
		   Temp->Next->Prev = Temp->Prev;
         
   		 free(Temp);
		 Temp = Copy;
	  }
}

template <typename T>
List<T>::Link* List<T>::begin()
{
   return Head;   // Return head of the list
}

template <typename T>
List<T>::Link* List<T>::end()
{
   return End;   // Return end of the list
}

#endif



// voici un court exemple d'utilisation

#include <iostream>
#include "List.h"

using namespace std;


int main()
{
    List<char> l;
    
    l.push_back('z');
    l.push_back('p');
    l.push_front('r');
    l.push_back('b');
    l.push_front('p');
    l.push_back('i');
    l.push_front('p');
    l.push_back('u');
    l.push_back('p');

    cout << l << endl;

    l.remove('p');

    cout << l << endl;

    l.pop_front();
    l.pop_back();

    return 0;
}

 Conclusion

Je l'ai fait sur VC++...
Le seul problème dans mon code se situe dans le code du destructeurs : lorsque je libere avec free(), j'ai un "Fatal error !", je ne sais pas pourquoi, pourtant, je free() les bons elements (j'ai verifié lors du debugage). C'est pour ca que j'ai mis free() en comentaires (//).

Par contre, je suis desolé, je n'ai pas mis de commentaires (le peu qui s'y trouve, je l'ai mis en anglais :s)
Sinon le code n'est pas difficile a comprendre... bye !

PS : j'accepte tous commentaires.


 Historique

06 septembre 2005 18:11:51 :
2 fois rien
07 septembre 2005 13:30:31 :
Supression de 2 lignes inutiles (merci magic_nono)

 Sources du même auteur

Source avec Zip Source avec une capture REGISTRY GUARD BETA

 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

UTILISATION DES TYPELIST EN C++ par wyden
PERFORMANCE DE DIFFÉRENTS CONTAINERS DE LA STL par TeddyBear94
Source avec Zip IMPLÉMENTATION DAWG par Ze1wina
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik
Source avec Zip CALLOCATOR par troctsch

Commentaires et avis

Commentaire de magic_Nono le 06/09/2005 23:29:55

Bien

prend l'habitude de distinguer les variables membres de tes classes:
par exemple, l'usage est de les préfixer par 'm_'

de plus, évite les données publiques (tout comme tu évites déjà les variables globales)

cela donnerai qqch comme ça

template <typename T>
class List
{
private:
    typedef struct Link // Struct for linked list
    {
       T Value; // Value of new object
        
       Link *Next;
       Link *Prev;
    }Link;
    Link *m_End;
    Link *m_Temp;
    Link *m_Head;

public:
...
}

et vérifie que m_Temp soit vraiement util.



Pour poursuivre plus loin
tu peux te reporter sur BListeIndir qui est publié dans mes sources.

Bonne prog
Nono.



PS

qq rq sur ton constructeur, pour t'aider à reprendre ta classe

# template <typename T>
# List<T>::List() /* Constructor */
# {
#    Head = (Link *)malloc(sizeof(Link)); /* Prepare the list */
#    Head->Next = 0;
#    Head->Prev = 0;
#    Head->Value = 0;
#  
#    End = Head;
//là tu as égalisé end & head (c'est le mm élément)
//la suite est donc inutile
#    End->Next = 0;
#    End->Prev = 0;
# }


pour le destructeur enfin

template <typename T>
List<T>::~List() // Destructor
{
    Link* temp;
for( temp= Head;temp;temp=temp->Next)
    free(temp);
}


si tout le reste est bon, y a pas de raison que ça ne passe pas.

Commentaire de marik7335 le 07/09/2005 12:45:07

C'est pas mal, le concept est intéressant. Par contre, la class list de la STL implémente les itérateurs. ça serait intéressant de le faire.

Commentaire de Taron31 le 07/09/2005 13:13:22

Magic_nono : Ok, merci... je vais corriger ça :)
Marik7335 :  Ok j'implemente je vais implementer les iterateurs des que j'aurais le temps :)

Encore merci a tous pour vos commentaires

Commentaire de Zazour le 07/09/2005 15:32:03

pourquoi faire une classe "list" à la place d'utiliser directement "list" de la STL?

Commentaire de Taron31 le 07/09/2005 16:24:17

Zazour : c'est juste un petit exercice que j'ai posté pour les débutants, c'est une implementation...
Dans ce code je me suis servi des listes doublement chainées en C, ça peut apprendre a mieux s'en servir, d'autres personnes peuvent reprendre mon code et rajouter des fonctionnalistes (classement alphabet, etc..., CF BListeIndir de magic_nono).

C'ests ur que dans un projet, tu vas pas recoder une classe List, tu utiliseras direct la STL :)
Bye !

Commentaire de Zazour le 07/09/2005 18:10:05

ok,j'ai posté un peu vite en ne regarde pas le contenu,mais je regarderai ta source,cela parle de liste chainée.

Commentaire de Taron31 le 07/09/2005 19:22:29

oui : liste doublement chainée pour simuler les classes LIST de la STL...

Commentaire de DubbleM le 08/09/2005 08:14:24

Analyson ta liberation de mémoire dans le destructeur (imaginons que l'on enlève ton commentaire):

for(; Temp != 0 ; Temp = Temp->Next)
    free(Temp);

Que ce passe-t-il à l'exécution
   1) première partie du for initialisation : rien car for(;...)
   2) Teste de fin Temp!=0 (temp est rempli plus haut, imaginons qu'il y ai 2 elements donc temp!=0
   3) tu libère la mémoire sur la quelle temp pointe (free Temp)
   4) tu viens à la 3ème partie du for Temp=Temp->Next mais Temp (partie de droite) n'est plus alloué car tu a fait free, ton problème est a mon avis à ce niveau. Faudrait peut-être penser à sauver Temp->Next avant le free.

Commentaire de magic_Nono le 08/09/2005 09:27:44

évidemment....

=>mémoriser le ptr suivant avt de libérer l'elt...

Commentaire de Taron31 le 08/09/2005 18:54:40

Ha, ok merci :)
J'avais pas fait gaffe...

Commentaire de sbeuz le 23/09/2005 22:27:54

La methode est interessante :)
De + tu utilises une classe plutôt qu'une variable de type structuré. A++

Commentaire de Taron31 le 25/09/2005 09:25:56

Merci :-)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

List STL [ par gribgrib ] Salut,J'espere que quelqu'un pourra m'aiderVoila mon problème : j'insère des structures dans uns list mais une fois toutes mes structures insérées dan display list [ par adidmamah ] bon voici la situation : - j'ai un objet déclaré en variable globale- dans le constructeur de la class je cré la display list :glNewList(1,GL_COMPILE) probleme stl et retour de méthode [ par seb_nachos ] Bonjour, j'aurais aim&#233; savoir comment on fait pour renvoyer un template de la STL dans une m&#233;thode. Dans mon cas je veux renvoyer une "List" classe template et list stl ou pile [ par abdoulax ] Boujour, Je voudrai cr&#233;er une liste de classe contenant un template, comment puis je faire ?? list&lt;classe&lt;a,b&gt;&gt;&nbsp;&nbsp; //c'est list et class - tri sur les pointeur [ par DroledeBx ] Bonsoir, j'ai un problème avec une list. J'ai définit une class fiche. J'ai une list de pointeur vers des fiches. Je voudrais trier cette list. Avec s list (STL) de tableau [ par BozzoDodo ] Bonjour,j'aurais voulu créer une list de tableau.Je m'explique... en gros chaque élément de la liste possède 3 éléments (3 int par exemple).Mon code e Probleme pour l'utilisation du type list de la STL [ par tanguy_laverdure ] Bonjour,J'ai 2 classes utilisant les list de STL. La classe RoundTrip contient une liste d'entier, la pas de probleme. La classe Solution contient une STL et C++ [ par tanguy_laverdure ] Bonjour, Quelqu'un saurait me dire comment choisir entre les list, vector, map et deque de la STL.Je croix comprendre que les temps d'acces sont a peu Reutilisation de templates dans une méthode de class [ par mondrone ] Bonsoir, voilà mon problème : je tente de faire une class, contenant un std::list, mais cette classe elle même est en template. Pour certaines raiso problemme de trie [ par ymlcrom ] bonjour si qlq peut m'aider a trouver l erreur dans cette fonction de trie d'une list chainné void trie(fff*list,int max) { fff* t1; fff* t2;


Nos sponsors


Sondage...

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,749 sec (4)

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