liste circulaire, ca marche mais j ai quelque questions. - Algo - Programmation
Marsh Posté le 06-03-2004 à 08:38:09
xiluoc a écrit : circle.h qui nous as etait donne.
|
Oui, mais pas comme c'est fait en commentaire dans ta fonction sinon tu vas effacer le node courant. Il faut que tu fasses ton target=ring->next avant de décrocher le noeud de la liste, que tu le décroches et après que tu l'effaces. Aussi, il vaudrait mieux ajouter deux tests. Un premier pour t'assurer que le programmeur utilisant cette classe ne fait pas n'importe quoi et n'essaye pas d'effacer un élément alors que la liste est vide ; un deuxième pour remettre node à NULL lorsque le programmeur efface le dernier élément de la liste (sinon il va avoir des petits soucis lors de son prochain insert).
Citation : et aussi, copy constructor qu est que j y mais ? |
Il faut que tu y parcoures la liste à copier et que pour chaque élément d'origine, tu en crées un nouveau dans la liste de destination ; le plus simple à coder étant de parcourir la liste d'origine d'un coté et d'utiliser la fonction insert pour chaque item de l'autre.
Marsh Posté le 06-03-2004 à 08:50:22
merci,
oui le commentaire etait mal place il vas au debut pour le link et a la fin le delete target.
Code :
|
j ai utiliser cette classe pour resoudre josephus,
(au cas ou tu ne le saurai pas)
un cercle de n gas, tu choisis k pour intervalle et tout les k tu remove.
y a petit bug je tombe pas sur la bonne personne mais j y travaille =)
[3615 my life]
pour info c est notre premier assignement (devoir noter, y en a 4 par semestre et celui ci vaut 4% de la note final) de l unite comp225 ( programmation c++ data structure et algo) seconde annee a sydney. (macquarie uni)
Marsh Posté le 06-03-2004 à 09:01:54
Code :
|
Non, non, non. Deux bugs sur cette ligne.
Marsh Posté le 06-03-2004 à 09:14:41
hummm
il reste une node.(ring)
ring->next pointe vers ring
eh ben je la delete non ?
et y a plus rien ah si je dois invoquer le deconstructor de circle peut etre ?
inplementation de josephus
Code :
|
Marsh Posté le 06-03-2004 à 09:42:14
xiluoc a écrit : hummm |
Quelles seront les valeurs de length et de ring après le delete de ce dernier élément ?
Marsh Posté le 11-03-2004 à 13:53:43
,
j ai dut mal a comprendre le copy constructor, les bouquins que j ai n en parlent pas trop.
sinon pour le destructor :
Code :
|
<quote>
Il faut que tu y parcoures la liste à copier et que pour chaque élément d'origine, tu en crées un nouveau dans la liste de destination ; le plus simple à coder étant de parcourir la liste d'origine d'un coté et d'utiliser la fonction insert pour chaque item de l'autre.
</quote>
je cree un nouveau pointeur ring2 ?
et ensuite j insert un truc du genre :
Code :
|
le pointeur ring vas donc faire un tour complet ni vu ni connu
Ca serait sympa de m eclaircir un peu sur ce point.
Marsh Posté le 12-03-2004 à 07:04:58
xiluoc a écrit : , |
Le copy constructor sert surtout à deux choses:
- initialiser un objet en une passe à partir d'un objet de la même classe
- copier un objet automatiquement sans faire une copie membre à membre
Par exemple, imaginons une méthode de votre classe single:
Code :
|
Lorsque vous appelez la méthode test, si vous n'avez pas défini de copy constructor, comme le paramètre s de type single est passé par valeur, le compilateur fera une copie membre à membre pour vous. En sortie de la fonction, cette copie est détruite. Comme il s'agissait d'une copie membre à membre, cela veut dire que le pointeur ring de votre objet d'origine est maintenant invalide. Faire un copy constructor (correct) permet d'éviter ce genre de bugs.
Un exemple pour que cela soit plus clair :
Code :
|
Citation : sinon pour le destructor :
|
C'est bon.
Citation : je cree un nouveau pointeur ring2 ?
|
Il faut que vous utilisiez un autre pointeur (node * ring2=s.ring; par exemple) parce qu'une déclaration correcte du copy constructor sera :
Code :
|
C'est-à-dire que s (c'est l'objet à copier) est une référence vers un objet "constant" et que vous ne pouvez donc pas modifier ses membres. D'où la nécessité d'utiliser un autre pointeur tel que ring2.
Marsh Posté le 12-03-2004 à 13:01:57
merci ! pour toute ces explication !
je vais expliquer ce que j ai fait, et en meme temps essayer de comprendre pourquoi ca marche pas completement.
circle::circle(const circle & c)
si c pointe vers null, alors ma copy aussi.
sinon,
on cree un nouveau pointeur ring_cursor qui pointe vers la meme chose que c.ring (deja la je ne savait pas qu on pouvait acceder a une varible private d un objet en fesant obljet.var)
tant qu on as pas fait le tour de la source,
on insert(ring_cursor->num)
et on avance ring_cursor.
Code :
|
pour tester le copy constructor j ai fait ca :
Code :
|
et helas ... j obtient ca:
Code :
|
Marsh Posté le 12-03-2004 à 13:06:39
Code :
|
Vous avez un bug sur cette ligne (que vaut length?).
Code :
|
Ici, vous n'utilisez pas le constructeur par copie mais l'opérateur d'affectation.
Pour utiliser le constructeur par copie, il faut faire à la place :
Code :
|
Marsh Posté le 12-03-2004 à 13:51:21
ca y est ca marche! , eh ben j y aurai mis le temps.
Code :
|
Marsh Posté le 06-03-2004 à 08:14:05
circle.h qui nous as etait donne.
circle.cpp que j ai fais.
avec ca on devra resoudre le pb d ejosephus mais c est pas le pb.
question
pour la fonction remove
comme j ai un seul pointeur ring, et que justement c est lui qu on veut deleter.
je copie donc le numero de la case apres ring (4) dans ring.
et je "coupe" le chemin en indiquant que ring->next c est ring->next->next.
je diminue la taille de -1 et c est bon.
e.g (we c moche)
bref
est ce que je dois deleter la node en fesant.
node* target = ring->next
et delete node.
?
et aussi, copy constructor qu est que j y mais ?
merci,