2016-04-08 14 views
-1

Ich brauche Hilfe beim Erstellen einer nicht-binären Baumstruktur. Diese Struktur muss eine Klasse node mit so vielen Zeigern auf Knoten enthalten, wie der Knoten benötigt. Hier werde ich verwirrt.Erstellen einer nicht binären Baumstruktur in C++

Hier ist meine Klasse node:

class nodo{ 
public: 
    int id; 
    char info[255]; 
    nodo **son,*father; 
    nodo() 
    { 
     strcpy(info,""); 
     son=(nodo*)malloc(sizeof(nodo)); 
    } 
}; 

Soweit ich verstehe, ich jedes Mal einen neuen son Zeiger muss ich den folgenden Code tun muss:

son=(nodo*)realloc(sizeof(nodo)*t) 

t die Zahl des Seins Knoten, die ich hinzufügen möchte plus 1. Ich kann nicht verstehen, wie man auf die Zeiger zugreift. Zum Beispiel habe ich bereits 2 sons hinzugefügt und möchte auf die zweite zugreifen, wie soll ich das machen?

Gibt es einen anderen Ansatz für das Problem?

Jede Hilfe wird bedankt.

+0

Nein, realloc benötigt 2 Argumente: den vorherigen Zeiger und die neue * Gesamtgröße * einschließlich neuer und alter Elemente. Außerdem bedeutet "Sohn" Sohn ist ein Zeiger auf einen Zeiger und nicht ein Zeiger direkt auf einen Knoten. Warum würden Sie automatisch einen "Sohn" erstellen, wenn Sie einen Knoten erstellen? Du fügst dem Knoten nur Söhne bei, wenn er sie braucht? – kfsone

Antwort

1

Sie schreiben C++, nicht C. Versuchen Sie nicht, Ihr eigenes dynamisches Array von Grund auf neu zu implementieren. Die Standardbibliothek hat bereits std::vector, um das für Sie zu handhaben.

class nodo{ 
public: 
    int id; 
    std::string info; 
    nodo *parent; 
    std:::vector<nodo *> children; 

    nodo(nodo *parent) : parent(parent) 
    { 
    } 

    void add_child(nodo *child) { children.push_back(child); } 
}; 
+0

Da Sie die Funktionen der C++ - Standardbibliothek erwähnen, warum gehen Sie nicht einen Schritt weiter und verwenden hier intelligente Zeiger, wenn dies in der Tat ein Anwendungsfall ist, in dem sie nützlich sind? – SirDarius

+0

@SirDarius: Da es hier nicht genug Informationen gibt, um sicher zu sein, ist es der Fall. –

+0

Hallo! Danke für deine Antwort. Nur ein kurzer Zweifel. Wenn ich eine neue Kinder hinzufügen, wie gehe ich darüber? Irgendwelche guten Vektor-Tutorials? –

0

Sie versuchen, dynamisch ein Array von untergeordneten Zeigern für jeden Knoten zu erstellen. Dieser Ansatz ist in Ordnung, solange Sie wissen, wie viele Kinder der Knoten im Voraus haben wird.

Ihr Konstruktor sollte wie folgt aussehen:

nodo(int numsons) { 
    son = new nodo*[numsons]; 
} 

Dies wird eine Reihe von untergeordneten Knoten zuweisen, die Sie benötigen, um in der Deconstructor zu löschen.

Wenn Sie nicht wissen, wie viele Kinder der Knoten zuvor haben wird (wenn Sie den Konstruktor aufrufen), sollten Sie einen Vektor verwenden.