2012-12-05 5 views
2

Je crée un graphe simple où tous les nœuds (ou sommets) sont rassemblés dans une liste. Chaque nœud, à son tour, a une liste de pointeurs qui peuvent pointer vers plusieurs autres nœuds dans la première liste et appeler ces bords. Par exemple, disons que j'ai un graphique simple où A -> B et A -> C alors le nœud A aurait une liste de pointeurs vers B et C comme ses bords. Lorsque je crée le graphe, je crée d'abord le noeud et je le remplis avec tout ce qui est pertinent pour ce noeud (poids ou tout autre attribut). J'ajoute ensuite le nœud à la liste "Master" de tous les nœuds. Après cela, je passe alors l'adresse de ce noeud (maintenant le dernier objet dans la liste) en fonction d'ajouter à tous les nœuds parents:Comment créer une liste de pointeurs qui pointent vers des objets dans une autre liste?

AddChildNode(&MasterListOfNodes.back(), NameOfParent)

Ce qui suit est le code pour ajouter le nœud enfant le parent

void GraphReader::AddChildNode(Vertex * const aChildVertex, const string aParent) 
{ 
    for(list<Vertex>::iterator it = MasterListOfNodes.begin(); it != MasterListOfNodes.end(); it++) 
    { 
     if(it -> getName().compare(aParent) == 0) 
     { 
      it -> addEdge(aChildVertex); 
      break; 
     } 
    } 
} 

Où addEdge ajoute simplement le nouvel enfant aux parents "Edges" liste:

const void Vertex::addEdge(Vertex * aEdge) {mEdges.push_back(aEdge);} 

le problème que je vais avoir, est e la liste des bords pointent vers une copie de l'objet de la liste, et non l'objet réel dans la liste elle-même:

VS and Printout of Root Nodes and Edges

Note: les adresses des nœuds racine (sortie invite de commandes) ont été trouvé avec ce qui suit:

for (list<Vertex>::iterator it = MasterListOfNodes.begin(); it != MasterListOfNodes.end(); it++) 
{ 
    cout << "Name: " << it->getName() << " | Address: {" << &(*it) << "}" << endl; 
} 

Comment créer ma liste d'arêtes qui pointent vers le nœud maître?

+0

@JerryCoffin Exigences (comme il s'agit d'une affectation de classe) état pas de bibliothèques externes – KronoS

+0

Pourriez-vous ajouter les opérations avant 'AddChildNode (& MasterListOfNodes.back(), NameOfParent)'? Il est très improbable que vous fassiez quelque chose de mal là-bas, mais juste au cas où ... Aussi, y at-il une raison pour laquelle vous ajoutez les nœuds à 'MasterListOfNodes' mais les imprimez à partir de' mInternalGraph'? – Zeta

+0

@Zeta qui était une erreur de pâtes de copie. Pardon. – KronoS

Répondre

0

Lorsque vous utilisez: list<Vertex> alors la liste des données structure va gérer la façon dont Vertex sont stockés dans la mémoire

Ce que vous devez utiliser est: list<Vertex *>

Exemple:

int main() 
{ 
    Vertex * a = new Vertex (..); 

    list<Vertex*> v(); 

    v.add(a); 

    if (a == v[0]) 
    { 
     // both points at the same Vertex in memory 
    } 

    return 0; 
} 
Questions connexes