Liste chainnee

ahlam1 Messages postés 33 Statut Membre -  
 ahlam -
Bonsoir,
il faut que je programme une liste chainnee avec c++,
j fais 2 class :class chainon et class liste
chainon contien les attribut suivant : char *m_mot;
Chainon* suiv;
et la class liste contient les atribut suivant: Chainon * l
je veux ecrire une fonction ajouter une dans la liste des mot (cad une chainne de carractere)
voici ma fct:
Liste Liste::ajouter(Liste ll,char *mott){

Chainon *p=new Chainon(mott,sizeof(mott),1);

Liste q;
q=ll;

if (q.getl()!= NULL)
{
while (q.getl()->getsuiv()!= NULL)
{
q.getl()=q.getl()->getsuiv();
}
;
q.getl()->getsuiv()=p;
return q;
}
else return q ;

}

mais apres la compilation l'erreur suivante apparu: non-lvalue assignment
si quelqu'un peux m'aider je serai tres reconnaissante
A voir également:

3 réponses

Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
 
tout d'abord là je pense que tu pourrais utiliser des chaines String (standard C++) plutot que les chaines style C en char*, ceci t'éviterait certains tracas :
En C, tu n'obtiens pas la longueur d'une chaine c avec sizeof(c), mais avec strlen(c) . Je ne sais pas trop si c'est ce que tu souhaites faire ou non.

Sinon concrètement concernant ton erreur :non-lvalue assignment
quelle ligne de ton code est associée à cette erreur ?
(Elle signifie que tu essayes de donner une valeur à qqchose qui n'est pas une adresse de variable, ex : 3 = 2+5 est invalide et devrait causer la même erreur, ou encore MaFonctionRetournantUnInt = 7 )
0
ahlam
 
salut,
la ligne du code associée à cette erreur est :
while (q.getl()->getsuiv()!= NULL)
et aussi la meme erreur pour la ligne:
q.getl()->getsuiv()=p;

Liste Liste::ajouter(Liste ll,char *mott){ //ajouter a la fin de la liste

Chainon *p=new Chainon(mott,sizeof(mott),1);

Liste q;
q=ll;

if (q.getl()!= NULL)
{
while (q.getl()->getsuiv()!= NULL)//ici je parcoure la liste pour
{ //arriver a la fin de la
q.getl()=q.getl()->getsuiv(); //liste

} //

q.getl()->getsuiv()=p;//ici je change les poiteur pour que le dernier element sera le
// nouveau elemen
return q;
}
else return q ;//le else si la liste est vide

};

ok je vai utiliser string, merci
0
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663
 
alors il te montre la ligne du while car l'erreur est dans le corps de la boucle (probablement
q.getl()=q.getl()->getsuiv(); )
. Puis il te précise la même erreur :
q.getl()->getsuiv()=p;

si tu veux que tes fonctions getl() et getsuiv() renvoient une référence, il faut le préciser.

Apparemment elles renvoient une copie ou je ne sais quoi. Comment sont elles définies exactement ?
0
ahlam
 
voila mes 2 class:
class Chainon{
public:
Chainon(char *mot,int taille,int nbr_apparition);
char *getmot(){return m_mot;};
int gettaille(){return m_taille;};
int getnbr_apparition(){return m_nbr_apparition;};
Chainon* getsuiv(){return suiv;};
void settnbr_apparition(int nbr_apparition){m_nbr_apparition=nbr_apparition;};
void settaille(int t){m_taille=t;};
void setmot(char *mot){m_mot=mot;};

private:
char *m_mot;
int m_taille;
int m_nbr_apparition;
Chainon* suiv;
};

class Liste{
public:
Liste();
Chainon* getl(){return l;};
void lire_mot(FILE *f,char *mot,int *arret);
Liste ajouter(Liste ll,char *mott);
private:
Chainon * l;//pour parcourir la liste c la tete
};
0
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663 > ahlam
 
mmm... je ne suis pas un pro, mais je crois qu'il y a un problème avec le fait de renvoyer des références vers une variable private. Ce n'est pas très propre. Tu devrais plutot créer des fonctions public void setSuiv(Chainon*) et void setl(Chainon*) et les utiliser à ces moments-là.

(mais je ne garantis rien, encore une fois c'est juste une piste)
0
ahlam > Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention  
 
merciiiiiiiiiiiiiiiiiiii
ca a marcher, il ne me donne plus cet erreur
j utiliser set pour le changer ,oui c vraiment logique puisque l est private il faut la changer que depuis la fct setl
merci merci merci tt l'aprem j charcher mais j n'est pas trouver
0
Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention   663 > ahlam
 
Hello

Alors en fait j'y ai pensé pendant la nuit, ça me tracassait apparemment ^^

Ma solution résoud le problème, mais le problème n'était pas un truc de private ou comme ça.
L'erreur était plus "basique" que ça.

Tu ne retournes pas un lien vers la variable private de l'objet. Tu retournes juste un nouveau pointeur qui pointe vers le même Chainon, mais tu pensais que ce pointeur "était" la variable private de ton objet, ce qui est incorrect.
Ceci, c'est tout à fait possible, même si la variable est private (mais ce n'est absolument pas propre car ça brise le principe d'encapsulation) :

Chainon** getsuiv(){return &suiv;};

ainsi avec cette fonction, tu retournes un pointeur vers la véritable variable pointeur de l'objet "suiv" .
ensuite tu peux faire (...getsuiv())* = un autre pointeur

et cette ligne change effectivement le pointeur de l'objet.
0
ahlam > Pacorabanix Messages postés 4122 Date d'inscription   Statut Membre Dernière intervention  
 
merci,
mais je n'est pas compris votre expliquation et pourquoi vous avez dit de définir getsuiv ainsi :
Chainon** getsuiv(){return &suiv;};
cad getsuiv retourne double pointeur
j défini getsuiv : void getsuiv(chainon * a){suiv=a;}
void setl(chainon * c){l=c;}
et puis getl(q.getl()->getsuiv());
alors il ma pa donner d'erreur de compilation .
0