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

Code

 > 

Maths & Algorithmes

 > LISTES DOUBLEMENT CHAÎNÉES

LISTES DOUBLEMENT CHAÎNÉES


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :listes, doublement, chaînées Niveau :Initié Date de création :18/11/2005 Vu :5 304

Auteur : nicolas66

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

 Description

Voilà un morceau de code sur les listes doublement chaînées qui aidera peut-être certaines personnes.

Source

  • template<typename T> class CNode
  • {
  • protected :
  • T m_Value;
  • CNode<T> * m_Previous, * m_Next;
  • public :
  • CNode( const T & Value = T(), CNode<T> * Previous = NULL, CNode<T> * Next = NULL ) : m_Value(Value), m_Previous(Previous), m_Next(Next) {}
  • CNode( const CNode<T> & Node )
  • {
  • m_Value = Node.m_Value;
  • m_Previous = Node.m_Previous;
  • m_Next = Node.m_Next;
  • }
  • ~CNode() {}
  • CNode<T> & CNode<T>::operator = ( const CNode<T> & Node )
  • {
  • if( m_Previous )
  • delete m_Previous;
  • if( m_Next )
  • delete m_Next;
  • m_Value = Node.m_Value;
  • m_Previous = Node.m_Previous;
  • m_Next = Node.m_Next;
  • return (*this);
  • }
  • void SetPrevious( CNode<T> * Previous )
  • {
  • m_Previous = Previous;
  • }
  • CNode<T> * GetPrevious() const
  • {
  • return m_Previous;
  • }
  • void SetNext( CNode<T> * Next )
  • {
  • m_Next = Next;
  • }
  • CNode<T> * GetNext() const
  • {
  • return m_Next;
  • }
  • T GetValue() const
  • {
  • return m_Value;
  • }
  • void SetValue( const T & Value )
  • {
  • m_Value = Value;
  • }
  • bool IsAlone() const
  • {
  • return !(m_Previous && m_Next);
  • }
  • };
  • template<typename T> class CLinkedList
  • {
  • private :
  • unsigned int m_NbElements;
  • CNode<T> * m_Head, * m_Tail;
  • public :
  • CLinkedList() : m_NbElements(0), m_Head(), m_Tail() {}
  • ~CLinkedList()
  • {
  • if( m_Head )
  • {
  • while( m_NbElements )
  • PopBack();
  • m_Head = NULL;
  • m_Tail = NULL;
  • }
  • }
  • bool IsEmpty() const
  • {
  • return (m_NbElements == 0);
  • }
  • CNode<T> * Head() const
  • {
  • return m_Head;
  • }
  • CNode<T> * Tail() const
  • {
  • return m_Tail;
  • }
  • const unsigned int & NbElements() const
  • {
  • return m_NbElements;
  • }
  • void PushBack( const T & Value )
  • {
  • CNode<T> * Node = new CNode<T>(Value);
  • if( !m_Head )
  • m_Head = Node;
  • Node->SetPrevious(m_Tail);
  • if( m_Tail )
  • m_Tail->SetNext(Node);
  • m_Tail = Node;
  • ++m_NbElements;
  • }
  • void PopBack()
  • {
  • if( m_NbElements > 0 )
  • {
  • if( m_NbElements == 1 )
  • m_Head = NULL;
  • CNode<T> * Node = m_Tail;
  • m_Tail = Node->GetPrevious();
  • if( m_Tail )
  • {
  • Node->SetPrevious(NULL);
  • m_Tail->SetNext(NULL);
  • }
  • --m_NbElements;
  • delete Node;
  • }
  • }
  • void PushFront( const T & Value )
  • {
  • CNode<T> * Node = new CNode<T>(Value);
  • if( !m_Tail )
  • m_Tail = Node;
  • Node->SetNext(m_Head);
  • if( m_Head )
  • m_Head->SetPrevious(Node);
  • m_Head = Node;
  • ++m_NbElements;
  • }
  • void PopFront()
  • {
  • if( m_NbElements > 0 )
  • {
  • if( m_NbElements == 1 )
  • m_Tail = NULL;
  • CNode<T> * Node = m_Head;
  • m_Head = Node->GetNext();
  • if( m_Head )
  • {
  • Node->SetNext(NULL);
  • m_Head->SetPrevious(NULL);
  • }
  • --m_NbElements;
  • delete Node;
  • }
  • }
  • bool Find( const T & Value )
  • {
  • CNode<T> * Node = m_Head;
  • for( Node = m_Head; Node; Node = Node->GetNext() )
  • if( Node->GetValue() == Value )
  • return true;
  • return false;
  • }
  • };
template<typename T> class CNode
{
    protected :
	T m_Value;
	CNode<T> * m_Previous, * m_Next;

    public :
	CNode( const T & Value = T(), CNode<T> * Previous = NULL, CNode<T> * Next = NULL ) : m_Value(Value), m_Previous(Previous), m_Next(Next) {}

	CNode( const CNode<T> & Node )
	{
		m_Value    = Node.m_Value;
		m_Previous = Node.m_Previous;
		m_Next     = Node.m_Next;
	}

	~CNode() {}

	CNode<T> & CNode<T>::operator = ( const CNode<T> & Node )
	{
		if( m_Previous )
			delete m_Previous;

		if( m_Next )
			delete m_Next;

		m_Value    = Node.m_Value;
		m_Previous = Node.m_Previous;
		m_Next     = Node.m_Next;

		return (*this);
	}

	void SetPrevious( CNode<T> * Previous )
	{
		m_Previous = Previous;
	}

	CNode<T> * GetPrevious() const
	{
		return m_Previous;
	}

	void SetNext( CNode<T> * Next )
	{
		m_Next = Next;
	}

	CNode<T> * GetNext() const
	{
		return m_Next;
	}

	T GetValue() const
	{
		return m_Value;
	}

	void SetValue( const T & Value )
	{
		m_Value = Value;
	}

	bool IsAlone() const
	{
		return !(m_Previous && m_Next);
	}
};

template<typename T> class CLinkedList
{
     private :
	unsigned int m_NbElements;
	CNode<T> * m_Head, * m_Tail;

     public :
	CLinkedList() : m_NbElements(0), m_Head(), m_Tail() {}

	~CLinkedList()
	{
		if( m_Head )
		{
			while( m_NbElements )
				PopBack();

			m_Head = NULL;
			m_Tail = NULL;
		}
	}

	bool IsEmpty() const
	{
		return (m_NbElements == 0);
	}

	CNode<T> * Head() const
	{
		return m_Head;
	}

	CNode<T> * Tail() const
	{
		return m_Tail;
	}

	const unsigned int & NbElements() const
	{
		return m_NbElements;
	}

	void PushBack( const T & Value )
	{
		CNode<T> * Node = new CNode<T>(Value);

		if( !m_Head )
			m_Head = Node;

		Node->SetPrevious(m_Tail);

		if( m_Tail )
			m_Tail->SetNext(Node);

		m_Tail = Node;
		++m_NbElements;
	}

	void PopBack()
	{
		if( m_NbElements > 0 )
		{
			if( m_NbElements == 1 )
				m_Head = NULL;

			CNode<T> * Node = m_Tail;
			m_Tail          = Node->GetPrevious();

			if( m_Tail )
			{
				Node->SetPrevious(NULL);
				m_Tail->SetNext(NULL);
			}
			
			--m_NbElements;
			delete Node;
		}
	}

	void PushFront( const T & Value )
	{
		CNode<T> * Node = new CNode<T>(Value);

		if( !m_Tail )
			m_Tail = Node;

		Node->SetNext(m_Head);

		if( m_Head )
			m_Head->SetPrevious(Node);

		m_Head = Node;
		++m_NbElements;
	}

	void PopFront()
	{
		if( m_NbElements > 0 )
		{
			if( m_NbElements == 1 )
				m_Tail = NULL;

			CNode<T> * Node = m_Head;
			m_Head          = Node->GetNext();

			if( m_Head )
			{
				Node->SetNext(NULL);
				m_Head->SetPrevious(NULL);
			}
			
			--m_NbElements;
			delete Node;
		}
	}

	bool Find( const T & Value )
	{
		CNode<T> * Node = m_Head;

		for( Node = m_Head; Node; Node = Node->GetNext() )
			if( Node->GetValue() == Value )
				return true;

		return false;
	}
};

 Conclusion

Aucun bug connu pour l'instant.


 Sources du même auteur

Source avec Zip LIDY - BIBLIOTHÈQUE DE GESTION DE MATRICES CREUSES

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LISTE DOUBLEMENT CHAINÉE par Slyders
40 PROCÉDURES POUR LA GESTION D'UNE LISTE LINÉAIRE CHAÎNÉE !... par bregredj
Source avec Zip ANNUAIRE BASÉ SUR LE PRINCIPE DE LISTE CHAINÉ par badrsmimite
LISTES CHAINÉES BIDIRECTIONNELLES (CREATION DYNAMIQUE) par naim16

Commentaires et avis

Commentaire de DormeurDev le 18/11/2005 20:26:33

C'est très clair.

juste un petit truc :
CNode( const T & Value = T(), CNode<T> * Previous = NULL, CNode<T> * Next = NULL ) : m_Value(Value), m_Previous(Previous), m_Next(Next) {}

S'il n'y a pas de constructeur T() (sans paramètre), il se passe pas comme une petite erreur à la validation ?
Je fais cette remarque de tête, sans vérifier mes dires.

Commentaire de nicolas66 le 19/11/2005 16:13:48

Evidemment mon code s'appuie sur le fait qu'un constructeur sans paramètres doit être déclaré sans ca il risque de grogner. Désolé pour les commentaires j'ai complètement oublié d'en mettre :/

Commentaire de DormeurDev le 19/11/2005 18:09:52

OK

PS : "validation" !? je voulais écrire "compilation" mais on a dû me parler pendant que j'écrivais...

Commentaire de Alain Proviste le 19/11/2005 18:14:02 administrateur CS

ou alors tu "dormais"

Commentaire de DormeurDev le 19/11/2005 19:22:21

:P

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Problème avec les listes chaînées double [ par marik7335 ] Salut,Je comprends le principe des listes chaînées simples mais je n'arrive pas à utiliser les listes chaînées double.Ce que je voudrais faire c'est u Listes chaînées et fichiers binaires [ par asgardia ] Bonjour,J'ai sauvegardé mes listes chaînées dans un fichier texte binaire. Seulement, je ne sais pas comment reconstruire ma liste chaînée à partir de listes chainées [ par tony_77 ] bonjour,J'ai un projet à faire en C++, je suis débutant.J'ai choisi d'utiliser une liste chainée que je sauvegarde ds un fichier .txt.Il faut donc que listes chainées (création de n listes) [ par IH2MCBETA ] Bonjour , je désir créer un nombre n de liste chainées.Ma liste :CLayer current2;POSITION current2_pos;CList &lt;CLayer,CLayer&gt; list_lay liste doublement chainée circulaire. [ par BassemH ] SalutEst-ce qeulqu'un peut m'aider à déclarer une liste doublement chainée circulaier? J'en ai besoin pour mon programme dont je dois manipuler des ex j'ai besoin d'un cours sur les listes et les piles en language c [ par anoir19 ] salut les amisje m'appelle anoir etudiant 2eme annéé informatique lmdj'ai besoin d'un cours sur les listes et les piles en language cmerci CREATION D'UNE BIBLIOTHEQUE BIGINTEGER EN C AVEC LES LISTES CHAINEES [ par Scorpio2hope ] Bonjour à tous,J'aimerais concevoir une bibliothèque(librairie) de grands entiers BIGINTEGER en C avec les listes chaînées. Je veux lui ajouter des op programmer le simplex avec des listes chainées [ par leFeu ] En fait, je dois programmer le SIMPLEX, je l'ai déja fait avec des tabeaux pour pouvoir mémoriser les bases a chaque itération.ma question : est il vr programmatin des piles et listes en C [ par amenienis ] Bonjour;SVP s'il ya qque qui peut me programmer cet algo en langage Ccar je ne sais pas comment on programme les listes et les piles?!/////Tour de bou Liste circulaire doublement chainee [ par OSSOUBB ] Bonjour, Je voudrais savoir comment peut-on parcourir(suivant et precedent)et supprimer un element dans une liste circulaire doublement chainée en jav


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

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