2017-10-14 8 views
-1

Je dois implémenter une liste ordonnée bidirectionnelle d'une manière spécifique, et je me suis coincé. J'ai une classe Bag qui a une classe Element à l'intérieur. Maintenant, le problème est quand je veux placer un objet dans le sac.Implémentation d'une liste ordonnée bidirectionnelle, comment renvoyer un pointeur pour lui donner une valeur?

Un élément a une clé (sa valeur), un pointeur vers l'élément le plus petit (_down) et un vers le plus grand (_up). Quand je mets un nouvel élément à l'intérieur du sac le code est le suivant (les noms traduits il est donc plus facile à comprendre)

void Bag::put(int e) { 
    if(_item_count==0){ 
     Element *element = new Element(e, nullptr, nullptr); 
     _bot = element; 
     _top = element; 
    }else{ 
     Element *p = _bot; 
     while(e > p->key()){ 
      p = p->up(); 
     } 
     Element *element = new Element(e, p, p->down()); 
     p->down() = element; 
    } 
} 

Le problème est que P-> vers le bas() est incessible. Je suppose que je devrais retourner le pointeur par référence, mais je ne sais pas comment faire cela.

fonction vers le bas()

Bag::Element *Bag::Element::down() { 
    return _down; 
} 

J'ai essayé de mettre & à de nombreux endroits, mais je ne peux pas comprendre comment faire fonctionner le tout.

Voici le code complet si nécessaire, mais ses variables sont pour la plupart hongroises, je fournirai la traduction si nécessaire. Header on the left, cpp on the right

+0

Hmm Je suis inquiet ... et si vous ajoutez 2 à votre liste en premier puis 3? e serait plus grand que 2, et donc p = p-> up(), mais l'élément p-> up() devrait être nul, donc votre p-> key() serait déréférencé null ne le serait-il pas? – Eddge

+0

Je n'ai pas encore travaillé sur la procédure de mise en place lorsque j'ai posé la question, je voulais juste que ça marche. Mais vous avez raison, le code que j'ai posté ici n'est pas encore définitif (pas même proche). – Viktor

Répondre

0

Cela renverra une référence lvalue non-const pointeur qui est bon d'être affecté à:

Bag::Element *&Bag::Element::down() { 
    return _down; 
} 

Et fournir peut-être vous devriez aussi une surcharge const:

Bag::Element * const &Bag::Element::down() const { 
    return _down; 
} 

de Bien sûr, vous devez mettre à jour votre déclaration de classe en conséquence. Et vous pouvez également utiliser une structure pour des classes aussi simples que Element en créant des champs de pointeurs public (qui est le contrôle d'accès par défaut pour les structures.) En général, vous ne serez pas bombardé en C/C++, contrairement à . Java où les gens ont tendance à insister sur l'utilisation des champs privés et/getter setters même pour les classes super simples (. Je ne dis pas ce bon ou mauvais, juste une sorte de convention)

+0

Oui, cela a fonctionné, merci – Viktor

0

le pointeur suffit de lui assigner directement:

p->_down = element; 

Notez que vous ne modifiez que le pointeur "bas" de l'élément suivant.Vous devez également modifier le point nter de l'élément précédent.

Notez également que votre nouvel élément peut être le premier ou le dernier élément de la liste, vous devez gérer ces cas spécialement. Une fois que vous faites cela, vous pouvez découvrir qu'une manipulation spéciale de la liste vide est inutile.