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