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

Code

 > 

Divers

 > LISTE CHAINÉE (TEMPLATE, NOEUD LOCAL OU GLOBAL, INSERTION OU ON VEUX)

LISTE CHAINÉE (TEMPLATE, NOEUD LOCAL OU GLOBAL, INSERTION OU ON VEUX)


 Information sur la source

 Description

salut,
aucune pretention pour ce code, il est tout simple, c'est juste que je n'aime pas les vector, string et autre.

il devrait être compatible tout OS et compilateur à quelques instructions prets (le bloc _asm par exemple)
si vous avez les #if à rajouter pour le code asm en fonction du compilo et OS... ecrivez le moi, merci




Source

  • //Fait par: Dark Poulpo
  • //le :13/12/2006, 15:04:04
  • // node.h
  • #include <assert.h>
  • enum DNodePosition{
  • DNFIRST, DNLAST, DNACTUAL, DNNEXT
  • };
  • template <class T> class DNode
  • {
  • protected:
  • static DNode *first;
  • static DNode *last;
  • static unsigned int size;
  • DNode *next;
  • DNode *previous;
  • T D;
  • public:
  • DNode *Insert(T data,DNodePosition p= DNNEXT) {
  • if (p == DNACTUAL) {
  • DNode *n = new DNode(data,p);
  • assert(n&&"Enable to create a node");
  • if (first == this) first = n;
  • n->next = this;
  • if (previous) previous->next = n;
  • previous = n;
  • return n;
  • } else if (p == DNNEXT) {
  • DNode *n = new DNode(data,p);
  • assert(n&&"Enable to create a node");
  • n->next = next;
  • n->previous = this;
  • if (this == last) last = n;
  • if (next) next->previous = n;
  • next = n;
  • return n;
  • } else {
  • DNode *n = new DNode(data,p);
  • assert(n&&"Enable to create a node");
  • return n;
  • }
  • }
  • DNode(T d,DNodePosition p= DNLAST) {
  • next = previous = NULL;
  • D = d;
  • if (p == DNLAST) {
  • if (!size) first = this;
  • else {
  • last->next = this;
  • previous = last;
  • }
  • last = this;
  • } else if (p == DNACTUAL) {
  • if (!size) {
  • first = this;
  • last = this;
  • }
  • } else if (p == DNNEXT) {
  • if (!size) {
  • first = this;
  • last = this;
  • }
  • } else if (p == DNFIRST) {
  • if (!size) last = this;
  • else {
  • first->previous = this;
  • next = first;
  • }
  • first = this;
  • }
  • size++;
  • }
  • ~DNode() {
  • if (previous) previous->next = next;
  • if (next) next->previous = previous;
  • if (first == this) first = next;
  • if (last == this) last = previous;
  • size--;
  • if (!size) {
  • first =NULL;
  • last = NULL;
  • }
  • }
  • T GetData() {
  • return D;
  • }
  • DNode *operator[](unsigned int p) {
  • DNode *t = first;
  • if (p >=size) return NULL;
  • while (t) {
  • if (!p) return t;
  • }
  • return NULL;
  • }
  • static unsigned int Size() {
  • return size;
  • }
  • static DNode *First() {
  • return first;
  • }
  • static DNode *Last() {
  • return last;
  • }
  • DNode *Next() {
  • return next;
  • }
  • DNode *Previous() {
  • return previous;
  • }
  • DNode *Delete() {
  • DNode *tmp =next;
  • DNode *actual=this;
  • unsigned long pile,moi;
  • _asm {
  • mov pile, esp
  • }
  • pile &= 0xff300000; // pile systeme
  • moi = ((unsigned long)this) & 0xff300000; // meme mask pour identifier si dans pile system
  • /*
  • un autre moyen etait de verifier si l'adresse dans this est < 0x400000 mais pas compatible tout OS
  • je suppose que le test actuel a plus de chance de l'etre
  • */
  • if ( moi == pile) { // si c'est un noeud cree en pile, donc local
  • if (previous) previous->next = next;
  • if (next) next->previous = previous;
  • if (first == this) first = next;
  • if (last == this) last = previous;
  • size--;
  • if (!size) {
  • first =NULL;
  • last = NULL;
  • }
  • previous = NULL;
  • next = NULL;
  • } else delete this;
  • return tmp;
  • }
  • };
  • template<class T> DNode<T> *DNode<T>::first = 0;
  • template<class T> DNode<T> *DNode<T>::last = 0;
  • template<class T> unsigned int DNode<T>::size = 0;
  • //----------------------------------------------------------------------------
  • // exemple de code juste en dessous
  • //----------------------------------------------------------------------------
  • //Fait par: Dark Poulpo
  • //le :13/12/2006, 15:02:12
  • // essai.cpp : Defines the entry point for the console application.
  • //
  • #include "..\node.h"
  • struct g
  • {
  • g(int i) {p=i;}
  • int p;
  • };
  • typedef DNode<g*> ma;
  • void supprime()
  • {
  • ma *j = ma::First();
  • j->Delete();
  • }
  • void supprimetout()
  • {
  • ma *j = ma::First();
  • while (j) {
  • delete j->GetData();
  • j= j->Delete();
  • }
  • }
  • void affiche()
  • {
  • ma *j = ma::First();
  • while (j) {
  • g *p = j->GetData();
  • printf ("%d\n",p->p);
  • j = j->Next();
  • }
  • }
  • void ajoute()
  • {
  • ma j(new g(6)); // noeud local
  • ma *k = new ma(new g(7),DNFIRST); //noeud global
  • affiche();
  • }
  • int main(int argc, char* argv[])
  • {
  • ma m(new g(1));// noeud local
  • ma mp(new g(2));// noeud local
  • ma *l= new ma(new g(3));//noeud global
  • l->Insert(new g(4),DNACTUAL);//noeud global
  • l->Insert(new g(5));//noeud global
  • affiche();
  • supprime();
  • affiche();
  • ajoute();
  • affiche();
  • supprimetout();
  • affiche();
  • return 0;
  • }
//Fait par: Dark Poulpo
//le      :13/12/2006, 15:04:04
// node.h

#include <assert.h> 

enum DNodePosition{
	DNFIRST, DNLAST, DNACTUAL, DNNEXT
};


template <class T> class DNode
{	
protected:
	static DNode *first;
	static DNode *last;
	static unsigned int size;
	DNode *next;
	DNode *previous;
	T D;
public:

	DNode *Insert(T data,DNodePosition p= DNNEXT) {
		if (p == DNACTUAL) {
			DNode *n = new DNode(data,p);
			assert(n&&"Enable to create a node");
			if (first == this) first = n;
			n->next = this;
			if (previous) previous->next = n;
			previous = n;
			return n;
		} else if (p == DNNEXT) {
			DNode *n = new DNode(data,p);
			assert(n&&"Enable to create a node");
			n->next = next;
			n->previous = this;
			if (this == last) last = n;
			if (next) next->previous = n;
			next = n;
			return n;
		} else {
			DNode *n = new DNode(data,p);
			assert(n&&"Enable to create a node");
			return n;
		}
	}
	
	DNode(T d,DNodePosition p= DNLAST) {
		next = previous = NULL;
		D = d;

		
		if (p == DNLAST) {
			if (!size) first = this;
			else {
				last->next = this;
				previous = last;
			}
			last = this;
		} else if (p == DNACTUAL) {
			if (!size) {
				first = this;
				last = this;
			}

		} else if (p == DNNEXT) {
			if (!size) {
				first = this;
				last = this;
			} 
		} else if (p == DNFIRST) {
			if (!size) last = this;
			else {
				first->previous = this;
				next = first;
			}
			first = this;
		}

		size++;
	}

	~DNode() {
		if (previous) previous->next = next;
		if (next) next->previous = previous;
		if (first == this) first = next;
		if (last == this) last = previous;
		size--;
		if (!size) {
			first =NULL;
			last = NULL;
		}
	}

	T GetData() {
		return D;
	}

    DNode *operator[](unsigned int p) {
		DNode *t = first;
		if (p >=size) return NULL;
		while (t) {
			if (!p) return t;
		}
		return NULL;
	}

	static unsigned int Size() {
		return size;
	}

	static DNode *First() {
		return first;
	}

	static DNode *Last() {
		return last;
	}

	DNode *Next() {
		return next;
	}

	DNode *Previous() {
		return previous;
	}

	DNode *Delete() {
		DNode *tmp =next;
		DNode *actual=this;

		unsigned long pile,moi;
		_asm {
			mov pile, esp
		}

		pile &= 0xff300000; // pile systeme
		moi = ((unsigned long)this) & 0xff300000; // meme mask pour identifier si dans pile system
		
		/*
			un autre moyen etait de verifier si l'adresse dans this est < 0x400000 mais pas compatible tout OS
			je suppose que le test actuel a plus de chance de l'etre
		*/
		if ( moi == pile) {  // si c'est un noeud cree en pile, donc local
			if (previous) previous->next = next;
			if (next) next->previous = previous;
			if (first == this) first = next;
			if (last == this) last = previous;
			size--;
			if (!size) {
				first =NULL;
				last = NULL;
			}
			previous = NULL;
			next = NULL;
		} else delete this;
		return tmp;
	}
};
template<class T> DNode<T> *DNode<T>::first = 0;
template<class T> DNode<T> *DNode<T>::last = 0;
template<class T> unsigned int DNode<T>::size = 0;





//----------------------------------------------------------------------------
//  exemple de code juste en dessous
//----------------------------------------------------------------------------

//Fait par: Dark Poulpo
//le      :13/12/2006, 15:02:12
// essai.cpp : Defines the entry point for the console application.
//

#include "..\node.h"


struct g
{
	g(int i) {p=i;}	
	int p;

};

typedef DNode<g*> ma;

void supprime()
{
	ma *j = ma::First();
	j->Delete();
}

void supprimetout()
{
	ma *j = ma::First();
	while (j) {
		delete j->GetData();
		j= j->Delete();
	}
}

void affiche()
{
	ma *j = ma::First();
	while (j) {
		g *p = j->GetData();
		printf ("%d\n",p->p);
		j = j->Next();
	}
}

void ajoute()
{
	ma j(new g(6)); // noeud local
	ma *k = new ma(new g(7),DNFIRST); //noeud global
	affiche();
}

int main(int argc, char* argv[])
{
	ma m(new g(1));// noeud local
	ma mp(new g(2));// noeud local
	ma *l= new ma(new g(3));//noeud global
	l->Insert(new g(4),DNACTUAL);//noeud global
	l->Insert(new g(5));//noeud global

	affiche();

	supprime();
	affiche();
	ajoute();
	affiche();
	supprimetout();
	affiche();
	return 0;
}




 Sources du même auteur

CONVERTIR CHEMIN RELATIF EN CHEMIN ABSOLUE (POUR DISQUE DUR)
SSCANF POUR SUPPRIMER DES ESPACES (COMME TRIM())
RECUPERER LE DNS DU SERVEUR MX MAIL D'UNE ADRESSE EMAIL
Source avec Zip ENCORE UN PARSER XML
MISE À JOUR DE VOS PROJETS PAR UNE DLL

 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

Source avec Zip Source avec une capture LISTE AVEC LES CLASSES C++ par alberd_m
Source avec Zip Source avec une capture LISTE DOUBLEMENT CHAINÉE par Slyders
Source avec Zip Source avec une capture LISTE CHAÎNÉE ORIENTÉE OBJET, BASÉE SUR LES TEMPLATES par exar
UNE LISTE DOUBLEMENT CHAINEE, CIRCULAIRE ET TEMPLATES par turnerom
Source avec Zip CLASSE CLISTE par bobbyantho

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Besoin D'aide [ par ChInOvSki ] J'ai créé ce programme, et j'en ai pas trouvé où est le probleme :s Voila Mon Prgrm: [size=300]Noeud.h[/size] #include using namespace std; templat 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 héritage & template [ par rolm ] Bonjour, J'aurai besoin d'un peu avec des tempates. En fait je voudrais créer une class qui hérite d'une class template mais d'un type donné. par e Liste comportant une classe template [ par horcks ] Bonjour, J'aurais voulu savoir s'il est possible de créer une liste contenant une classe template. Je m'explique : Voici le code (écourté) du template suppression d'un noeud dans une liste chaînée avec C++ [ par saidkoukou ] Bonjour, je cherche un bout de code C++(ou une méthode) qui me permet de supprimer un noeud dans une liste chaînée. Merci de me répondre dans le temps Chaine de caractères et liste de mots [ par joshua509 ] J'ai un gros problème d'algorithme. Comment faire pour placer,tous les mots séparer d'un espace d'une chaine de caractère,dans une liste chainée de mo créer une liste à partir d'un arbre [ par morganistic ] bonjour a tous!voila deux structures : une liste et un arbre.je n arrive pas a parcourir un arbre&nbsp;en inserant chaque noeud&nbsp;de l arbre dans u discuter un graphe [ par azamharir ] salutje dois implementer un graphe (graphe : cas général). je cherche la meilleure structure possible.je crois que je vais utiliser celle ci :une clas liste chainée [ par skulls94 ] bonjour, je dois faire un  programme qui lit un fichier mot à mot et qui les stocke dans une liste chainée seulement si ils ne sont pas deja present.v 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:


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

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