Classe - Liste Chainees

snoozriton Messages postés 12 Date d'inscription jeudi 22 décembre 2011 Statut Membre Dernière intervention 12 novembre 2010 - 23 janv. 2010 à 18:17
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011 - 24 janv. 2010 à 14:21
Bonjour à tous,
je me retrouve bloqué et je ne vois pas trop comment me décoincer.
Il s'agit d'un exercice à faire. Dans cet exercice nous avons des Etiquettes (ce sera une classe) et un Ensemble d'étiquettes (une autre classe).
Etiquette est composé de d'un prix et d'un info disant si le produit est en solde ou non.
Et je bloque pour faire la liste chainée dans la classe Ensemble...
Si quelqu'un peut m'éclairer.
J'ai mis la déclaration de la liste au sein de la classe. Peut-être dois-je la sortir ?

class Etiquette {
private:
bool solde;
float prix;
public:
void Saisie (bool s, float p){
solde=s;
prix=p;
}
};	





class Ensemble {
private:
struct maille {
Etiquette e;
struct maille *suivant;
};

typedef struct maille Maillon;
typedef Maillon * Liste;

//Ensemble (){}

void initialiser (Liste * l){
*l = NULL;
}

void ajout (Liste * l,bool s, float p){
Maillon * etiq;
etiq = new (Maillon);
etiq->e.Saisie(s,p);
etiq->suivant=*l;
*l=etiq;
}	
};

1 réponse

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 janv. 2010 à 14:21
Salut,

Soit tu utilises un conteneur de la STL, soit (si tu en est contraint) tu fais à la main, comme tu as fait.

Avec le conteneur vector de la STL, par exemple :
class Etiquette {
private:
bool solde;
float prix;
public:
void Saisie(bool s,float p) {
this->solde=s;
this->prix=p;
}
};

class Ensemble {
private:
vector <Etiquette> Liste;
public:
void initialiser(maille *l) {
this->Liste.clear();
}

void ajout(bool s,float p) {
Etiquette e;
e.Saisie(s,p);
this->Liste.push_back(e);
}	
};

int main() {
    Ensemble ens;
    ens.initialiser();
    bool s;
    float p;
    //On considère que s et p ont des valeurs (saisies au clavier, etc)
    ens.ajout(s,p);
    return 0;
}


Sinon, je ne comprends pas trop ta manière de faire... je ferais plutôt un truc dans le genre :
class Etiquette {
private:
    bool solde;
    float prix;
public:
    void Saisie (bool s,float p) {
        this->solde=s;
        this->prix=p;
    }
};

typedef struct maille {
    Etiquette e;
    struct maille *suivant;
}
maille;
class Ensemble {
private:
    maille *Liste;
public:
    void initialiser() {
        this->Liste=NULL;//Faire gaffe ici, si ta liste contenait des éléments,
        //ils ne seront pas effacés -> risque de fuite mémoire
    }
    void ajout(bool s,float p) {
        maille *etiq=new(maille);
        etiq->e.Saisie(s,p);
        etiq->suivant=Liste;
        Liste=etiq;
    }
};

int main() {
    Ensemble ens;
    ens.initialiser();
    bool s;
    float p;
    //On considère que s et p ont des valeurs (saisies au clavier, etc)
    ens.ajout(s,p);
    return 0;
}


Le problème avec cette méthode-ci, c'est que l'ordre est inversé (en fait, le membre "suivant" pointe sur l'élément précédent de la liste).
Il y a sans doute des erreurs, je n'ai plus de compilo sous la main. Et tu peux aussi directement intégrer l'équivalent de "maille *suivant" dans la classe Etiquette.

Cordialement, uaip.
0