Accueil > > > UNE LISTE CHAINÉE AVEC CLÉS
UNE LISTE CHAINÉE AVEC CLÉS
Information sur la source
Description
une liste chainée qui range des objets "ordonnables" (une classe abstraite, qu'il faut implémenter dans la classe "fille" à ranger dans la liste.
Je ne sais pas si ce genre de prog peut intéresser quelqu'un. Si ce n'est pas le cas, merci de me l'indiquer, je n'en mettrai plus.
Source
- #ifndef _LISTEORDONNEE_H_
- #define _LISTEORDONNEE_H_
-
- class Ordonnable
- {
- public:
- virtual ~Ordonnable(){}
-
- virtual int compareTo(Ordonnable *obj)=0;
- //Précond : obj doit être de même type que this
- //Résultat: retourne : -1,0 ou 1 selon que obj est resp <,= ou > à this
-
- virtual char *getIdentifiant()=0;
- //Précond : aucune
- //Résultat: retourne une chaine de caractères identifiant le type
- // d'objet. La chaine est dans le tas, et doit être détruite par
- // l'utilisateur. Cette fonction sert à la gestion des listes,
- // afin de garantir qu'une liste ne contient qu'un type d'objet
- // ordonnable (cette garantie n'est valable que dans la mesure
- // où l'utilisateur donne des identifiants différents à chaque
- // type d'objet ordonnable).
- };
-
- class CLOrdonnable
- {
- friend class ListeOrdonnee;
- //private:
- public:
- Ordonnable *val;
- CLOrdonnable *suiv;
- protected:
- public:
- CLOrdonnable(Ordonnable *val, CLOrdonnable *suiv=NULL);
- virtual ~CLOrdonnable();
- };
-
- class ListeOrdonnee
- {
- //private:
- public:
- //Tête de la liste chaînée
- CLOrdonnable *tete;
- //Identifiant des éléments reçus par la liste
- char *identifiant;
-
- int chercheCOrdonnable( Ordonnable *valCherchee,
- CLOrdonnable *&celTrouvee,
- CLOrdonnable *&celPrecedente);
- //Précond : val ne doit pas être nul.
- //Résultat: retourne 1 si valCherchee a été trouvée dans la liste, ou 3 si elle n'a
- // pas été trouvée.
- // si une erreur s'est produite, retourne son code.
- // Si la valeur a été trouvée, celTrouvee et celPrecedente pointent
- // respectivement la cellule contenant la valeur cherchée, et celle
- // la précédant.
- // Si la valeur n'a pas été trouvée, celTrouvee et celPrecedente pointent
- // resp sur la cellule contenant la valeur sup, et celle la précédant
-
- protected:
- public:
- ListeOrdonnee(char *identifiant=NULL);
- ~ListeOrdonnee();
-
- CLOrdonnable *getTete();
- //Précond : aucune
- //Résultat: retourne un pointeur sur la tete de la liste
-
- int ajouteElement (Ordonnable *val);
- //Précond : Si l'identifiant de type est déjà renseigné, l'objet passé
- // en paramètre doit posséder le même identifiant de type.
- // Si l'identifiant de type n'est pas renseigné, la liste prend
- // pour seul identifiant acceptable le type de l'objet passé en argument.
- // L'identifiant de l'instance de l'objet ne doit pas être déjà présent
- // dans la liste.
- // Si l'opération réussit, la méthode retourne 0. Si elle échoue,
- // un code d'erreur est retourné.
- //Action : Stocke l'objet passé en paramètre dans la liste ordonnée.
-
- int supprimeElement(Ordonnable *val);
- //Précond : Si l'identifiant de type est déjà renseigné, l'objet passé
- // en paramètre doit posséder le même identifiant de type.
- // L'identifiant de l'instance de l'objet ne doit pas être déjà présent
- // dans la liste.
- // Si l'opération réussit, la méthode retourne 0. Si elle échoue,
- // un code d'erreur est retourné.
- //Action : supprime l'objet possédant le même identifiant d'instance que celui
- // passé en paramètre, si il existe.
-
- int getNombreElements();
- //Précond : aucune
- //Résultat: retourne le nombre d'éléments présents dans la liste chaînée
-
- void vide();
- //Précond : aucune
- //Action : vide la liste. Tous les éléments sont supprimés de la liste,
- // et sont détruits.
- };
-
- #endif
-
- /*
- Codes des erreurs retournées
- 0 pas d'erreur
- 1 identifiant d'instance déjà présent
- 2 identifiant de type incorrect
- 3 identifiant d'instance non trouvé
- 4 pointeur nul interdit
- */
-
- CLOrdonnable::CLOrdonnable(Ordonnable *val, CLOrdonnable *suiv)
- {
- this->val = val;
- this->suiv = suiv;
- }
-
- CLOrdonnable::~CLOrdonnable()
- {
- delete(this->val);
- }
-
- ListeOrdonnee::ListeOrdonnee(char *identifiant)
- {
- int l;
- this->tete = NULL;
-
- if (identifiant==NULL)
- {
- this->identifiant=NULL;
- }
- else
- {
- l=strlen(identifiant);
- this->identifiant = new char[l+1];
- strcpy(this->identifiant,identifiant);
- }
- }
-
- ListeOrdonnee::~ListeOrdonnee()
- {
- this->vide();
- delete(this->identifiant);
- }
-
- CLOrdonnable *ListeOrdonnee::getTete()
- {
- return this->tete;
- }
-
- int ListeOrdonnee::chercheCOrdonnable( Ordonnable *valCherchee,
- /*R*/CLOrdonnable *&celTrouvee,
- /*R*/CLOrdonnable *&celPrecedente)
- {
- int resultComp;
- char *ident;
-
- if (valCherchee==NULL)
- {
- //erreur valeur nulle interdite
- return 4;
- }
-
- //test sur l'identifiant de type
- if (this->identifiant==NULL)
- {
- //Si l'identifiant de la liste n'a pas été initialisé,
- //on l'initialise avec l'identifiant de type de l'instance passée
- this->identifiant=valCherchee->getIdentifiant();
- }
- else
- {
- //Comparaison de l'identifiant de type de la liste, avec celui
- //du type de l'instance recherchée.
- ident = valCherchee->getIdentifiant();
- if (strcmp(ident,this->identifiant)!=0)
- {
- delete(ident);
- //erreur type incorrect pour cette liste
- return 2;
- }
- delete (ident);
- }
-
- //Recherche de l'indentifiant d'instance :
- //parcours partiel de la liste chainée, jusqu'à rencontrer une instance
- //dont la comparaison indique qu'elle est supérieure ou égale à celle recherchée
- resultComp=-1;
- celPrecedente = NULL;
- celTrouvee = this->tete;
- while ( celTrouvee!=NULL &&/*alors*/
- (resultComp=valCherchee->compareTo(celTrouvee->val))<0)
- {
- celPrecedente = celTrouvee;
- celTrouvee = celTrouvee->suiv;
- }
- if (resultComp!=0)
- {
- //identifiant d'instance non trouvé
- return 3;
- }
- //identifiant d'instance trouvé
- return 1;
- }
-
-
- int ListeOrdonnee::ajouteElement (Ordonnable *val)
- {
- CLOrdonnable *precedent=NULL;
- CLOrdonnable *trouve=NULL;
- CLOrdonnable *nouvelle=NULL;
- int result;
-
- result = chercheCOrdonnable(val,trouve,precedent);
- if (result != 3)
- {
- //erreur
- return result;
- }
- //création de la nouvelle cellule
- nouvelle = new CLOrdonnable(val,trouve);
- if (precedent==NULL)
- {
- //on est en tête de la liste
- this->tete = nouvelle;
- }
- else
- {
- precedent->suiv = nouvelle;
- }
- return 0;
- }
-
- int ListeOrdonnee::supprimeElement(Ordonnable *val)
- {
- CLOrdonnable *precedent=NULL;
- CLOrdonnable *trouve=NULL;
- int result;
-
- result = chercheCOrdonnable(val,trouve,precedent);
- if (result != 1)
- {
- //erreur
- return result;
- }
- if (precedent==NULL)
- {
- //on est en tête de la liste
- this->tete = trouve->suiv;
- }
- else
- {
- precedent->suiv = trouve->suiv;
- }
- delete(trouve);
- return 0;
- }
-
- int ListeOrdonnee::getNombreElements()
- {
- int nombre = 0;
- CLOrdonnable *parcours = this->tete;
-
- //Parcours total de la liste
- while (parcours!=NULL)
- {
- parcours = parcours->suiv;
- nombre++;
- }
- return 0;
- }
-
- void ListeOrdonnee::vide()
- {
- CLOrdonnable *temp;
-
- //parcours total de la liste
- while (this->tete!=NULL)
- {
- temp=this->tete;
- this->tete=temp->suiv;
- delete(temp);
- }
- }
#ifndef _LISTEORDONNEE_H_
#define _LISTEORDONNEE_H_
class Ordonnable
{
public:
virtual ~Ordonnable(){}
virtual int compareTo(Ordonnable *obj)=0;
//Précond : obj doit être de même type que this
//Résultat: retourne : -1,0 ou 1 selon que obj est resp <,= ou > à this
virtual char *getIdentifiant()=0;
//Précond : aucune
//Résultat: retourne une chaine de caractères identifiant le type
// d'objet. La chaine est dans le tas, et doit être détruite par
// l'utilisateur. Cette fonction sert à la gestion des listes,
// afin de garantir qu'une liste ne contient qu'un type d'objet
// ordonnable (cette garantie n'est valable que dans la mesure
// où l'utilisateur donne des identifiants différents à chaque
// type d'objet ordonnable).
};
class CLOrdonnable
{
friend class ListeOrdonnee;
//private:
public:
Ordonnable *val;
CLOrdonnable *suiv;
protected:
public:
CLOrdonnable(Ordonnable *val, CLOrdonnable *suiv=NULL);
virtual ~CLOrdonnable();
};
class ListeOrdonnee
{
//private:
public:
//Tête de la liste chaînée
CLOrdonnable *tete;
//Identifiant des éléments reçus par la liste
char *identifiant;
int chercheCOrdonnable( Ordonnable *valCherchee,
CLOrdonnable *&celTrouvee,
CLOrdonnable *&celPrecedente);
//Précond : val ne doit pas être nul.
//Résultat: retourne 1 si valCherchee a été trouvée dans la liste, ou 3 si elle n'a
// pas été trouvée.
// si une erreur s'est produite, retourne son code.
// Si la valeur a été trouvée, celTrouvee et celPrecedente pointent
// respectivement la cellule contenant la valeur cherchée, et celle
// la précédant.
// Si la valeur n'a pas été trouvée, celTrouvee et celPrecedente pointent
// resp sur la cellule contenant la valeur sup, et celle la précédant
protected:
public:
ListeOrdonnee(char *identifiant=NULL);
~ListeOrdonnee();
CLOrdonnable *getTete();
//Précond : aucune
//Résultat: retourne un pointeur sur la tete de la liste
int ajouteElement (Ordonnable *val);
//Précond : Si l'identifiant de type est déjà renseigné, l'objet passé
// en paramètre doit posséder le même identifiant de type.
// Si l'identifiant de type n'est pas renseigné, la liste prend
// pour seul identifiant acceptable le type de l'objet passé en argument.
// L'identifiant de l'instance de l'objet ne doit pas être déjà présent
// dans la liste.
// Si l'opération réussit, la méthode retourne 0. Si elle échoue,
// un code d'erreur est retourné.
//Action : Stocke l'objet passé en paramètre dans la liste ordonnée.
int supprimeElement(Ordonnable *val);
//Précond : Si l'identifiant de type est déjà renseigné, l'objet passé
// en paramètre doit posséder le même identifiant de type.
// L'identifiant de l'instance de l'objet ne doit pas être déjà présent
// dans la liste.
// Si l'opération réussit, la méthode retourne 0. Si elle échoue,
// un code d'erreur est retourné.
//Action : supprime l'objet possédant le même identifiant d'instance que celui
// passé en paramètre, si il existe.
int getNombreElements();
//Précond : aucune
//Résultat: retourne le nombre d'éléments présents dans la liste chaînée
void vide();
//Précond : aucune
//Action : vide la liste. Tous les éléments sont supprimés de la liste,
// et sont détruits.
};
#endif
/*
Codes des erreurs retournées
0 pas d'erreur
1 identifiant d'instance déjà présent
2 identifiant de type incorrect
3 identifiant d'instance non trouvé
4 pointeur nul interdit
*/
CLOrdonnable::CLOrdonnable(Ordonnable *val, CLOrdonnable *suiv)
{
this->val = val;
this->suiv = suiv;
}
CLOrdonnable::~CLOrdonnable()
{
delete(this->val);
}
ListeOrdonnee::ListeOrdonnee(char *identifiant)
{
int l;
this->tete = NULL;
if (identifiant==NULL)
{
this->identifiant=NULL;
}
else
{
l=strlen(identifiant);
this->identifiant = new char[l+1];
strcpy(this->identifiant,identifiant);
}
}
ListeOrdonnee::~ListeOrdonnee()
{
this->vide();
delete(this->identifiant);
}
CLOrdonnable *ListeOrdonnee::getTete()
{
return this->tete;
}
int ListeOrdonnee::chercheCOrdonnable( Ordonnable *valCherchee,
/*R*/CLOrdonnable *&celTrouvee,
/*R*/CLOrdonnable *&celPrecedente)
{
int resultComp;
char *ident;
if (valCherchee==NULL)
{
//erreur valeur nulle interdite
return 4;
}
//test sur l'identifiant de type
if (this->identifiant==NULL)
{
//Si l'identifiant de la liste n'a pas été initialisé,
//on l'initialise avec l'identifiant de type de l'instance passée
this->identifiant=valCherchee->getIdentifiant();
}
else
{
//Comparaison de l'identifiant de type de la liste, avec celui
//du type de l'instance recherchée.
ident = valCherchee->getIdentifiant();
if (strcmp(ident,this->identifiant)!=0)
{
delete(ident);
//erreur type incorrect pour cette liste
return 2;
}
delete (ident);
}
//Recherche de l'indentifiant d'instance :
//parcours partiel de la liste chainée, jusqu'à rencontrer une instance
//dont la comparaison indique qu'elle est supérieure ou égale à celle recherchée
resultComp=-1;
celPrecedente = NULL;
celTrouvee = this->tete;
while ( celTrouvee!=NULL &&/*alors*/
(resultComp=valCherchee->compareTo(celTrouvee->val))<0)
{
celPrecedente = celTrouvee;
celTrouvee = celTrouvee->suiv;
}
if (resultComp!=0)
{
//identifiant d'instance non trouvé
return 3;
}
//identifiant d'instance trouvé
return 1;
}
int ListeOrdonnee::ajouteElement (Ordonnable *val)
{
CLOrdonnable *precedent=NULL;
CLOrdonnable *trouve=NULL;
CLOrdonnable *nouvelle=NULL;
int result;
result = chercheCOrdonnable(val,trouve,precedent);
if (result != 3)
{
//erreur
return result;
}
//création de la nouvelle cellule
nouvelle = new CLOrdonnable(val,trouve);
if (precedent==NULL)
{
//on est en tête de la liste
this->tete = nouvelle;
}
else
{
precedent->suiv = nouvelle;
}
return 0;
}
int ListeOrdonnee::supprimeElement(Ordonnable *val)
{
CLOrdonnable *precedent=NULL;
CLOrdonnable *trouve=NULL;
int result;
result = chercheCOrdonnable(val,trouve,precedent);
if (result != 1)
{
//erreur
return result;
}
if (precedent==NULL)
{
//on est en tête de la liste
this->tete = trouve->suiv;
}
else
{
precedent->suiv = trouve->suiv;
}
delete(trouve);
return 0;
}
int ListeOrdonnee::getNombreElements()
{
int nombre = 0;
CLOrdonnable *parcours = this->tete;
//Parcours total de la liste
while (parcours!=NULL)
{
parcours = parcours->suiv;
nombre++;
}
return 0;
}
void ListeOrdonnee::vide()
{
CLOrdonnable *temp;
//parcours total de la liste
while (this->tete!=NULL)
{
temp=this->tete;
this->tete=temp->suiv;
delete(temp);
}
}
Conclusion
Dans le même registre, je suis en train d'essayer de faire un arbre binaire de recherche, et je voudrais, autant que possible, équilibrer les branches à chaque ajout (pour optimiser le nombre maximal de noeuds à traverser lors d'une recherche) mais j'ai un peu de mal.
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|