2016-04-17 3 views
0

Ich brauche einen Knoten, um auf mehrere Kinder (ich weiß nicht, wie viele von denen ich zur Zeit der Kompilierung) zeigen.
vorläufig brauche ich nur den Vaterknoten, um auf mindestens ein Kind zu zeigen.
aber es zeigt auf '0', was habe ich verpasst?
hier ist mein CodeVerwenden Sie ein Array von Knoten Zeigern, um auf ein Kind eines Knotens

#include <bits/stdc++.h> 
using namespace std; 

string tokens[10]; 

typedef struct node 
{ 
    char* value; 
    node* children[10]={NULL}; 
}node; 

void connect(node* father,node* child) 
{ 
    // child = (node*) malloc(sizeof(node*)); 
    if(father->children[0]!=NULL) 
     father->children[0]=child; 
     cout<<father->children[0]<<endl; 
} 

int main() 
{ 

node* father_ = (node*) malloc(sizeof(node*)); 
node* child_ = (node*) malloc(sizeof(node*)); 
cout<<"before\n"; 
connect(father_,child_); 
cout<<"after\n"; 

father_->children[0]->value="a"; 
cout<<child_->value; 

} 
+3

http://stackoverflow.com/questions/31816095/why-should-i-not-include-bits-stdc-h –

+1

Sie wollten 'sizeof (node)' nicht 'sizeof (node ​​*)' verwenden. –

+1

Ich wollte eine Antwort auf Ihre Frage schreiben, aber es würde nur Kapitel aus jedem C++ Buch zitieren. Versuchen Sie in C++ nach dynamischer Speicherzuordnung zu suchen; Konstruktoren, Destruktoren und RAII; verknüpfte Listen- und Datenstrukturen. – teivaz

Antwort

1
if(father->children[0]!=NULL) 
    father->children[0]=child; 

Sie nur einen Vater-Kind-Beziehung instanziiert, wenn der Vater bereits eine nicht hat -Nein erstes Kind. Ändern Sie != in == (oder löschen Sie sogar den !=NULL Teil, aber negieren Sie die Bedingung).

+0

ja !!! das war der dumme Fehler, danke –

2

Was ist die Obsession mit Zeigern? Hier eine mehr C++ Version.

#include <string> 
#include <vector> 
#include <iostream> 
#include <memory> 

struct node 
{ 
    std::string value; 
    std::vector<node*> children; 
}; 

void connect(node* father,node* child) 
{ 
    father->children.push_back(child); 
} 

int main() 
{ 
    auto father = std::make_unique<node>(); 
    auto child = std::make_unique<node>(); 

    connect(father.get(), child.get()); 

    father->children[0]->value="a"; 

    std::cout << child->value; 
} 

Live on Coliru

Hinweis:

  • vermeiden using naespace std
  • nicht verwenden malloc und free
  • Sie brauchen nicht zu struct in C++ typedef
  • Behälter verwenden, wie String und Vektor
  • vermeiden c Stil Arrays
  • verwenden Sie keine rohen Zeiger für den Besitz
+0

Ihr Code funktioniert einfach, und ich mag die reine C++ - Methode, die Sie zur Verfügung gestellt, ziemlich ordentlich. –

+0

Während ich Ihr Problem hätte beheben können, ist es besser, eine Lösung bereitzustellen, die das Problem vermeidet. – Thomas

+0

Ich schätze Ihre Hilfe wirklich. Während ich in diesem speziellen Projekt nicht vollständig von Zeigern wegsteuern konnte, fand ich es nützlich, Vektoren zu verwenden, um zu vermeiden, auf Zeiger zu zeigen. Allerdings ist die Verwendung von C++ 14 Methoden und Variablen in meiner Situation nicht anwendbar. –