Liste chainée (template, noeud local ou global, insertion ou on veux)

Contenu du snippet

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 / Exemple :


//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; }

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.