2016-06-26 8 views
1

Ich habe eine binäre Suche Struktur, für die ich versuche, eine Einfügefunktion zu implementieren. Aber wenn ich den Code teste, sehe ich, dass überhaupt kein Element hinzugefügt wird, obwohl mir meine Logik gut erscheint. Ich habe das Gefühl, dass es eine C-Idiosynkrasie gibt, die ich vermisse.Binary Search Tree nicht Element hinzufügen

struct tree_element { 
    int data; 
    struct tree_element* left; 
    struct tree_element* right; 
}; 

typedef struct tree_element node; 

void init(node* root){ 
    root->left = NULL; 
    root->right = NULL; 
    root->data = 0; 
} 

void insert(node* root, int val){ 
    if (root == NULL){ 
     root = (node*)(malloc(sizeof(node))); 
     init(root); 
     root->data = val; 
     printf("added %i\n", val); 
     return; 
    } 

    if (val > root->data){ 
     insert(root->right, val); 
    } 
    else { 
     insert(root->left, val); 
    } 
} 
+0

Sie müssen einen Doppelzeiger (einen Zeiger auf einen Zeiger) verwenden, aber es ist tatsächlich einfacher, den Knoten als Funktionsergebnis in 'einfügen' zurückzugeben. –

+0

Warum sollte ein Doppelzeiger notwendig sein? Und was ist mit dem aktuellen Code verhindert, dass Knoten hinzugefügt werden? –

+0

[Eine von * vielen * Duplikaten für dieses Problem] (https://stackoverflow.com/questions/6349196/binary-search-tree-pointer-problem). – WhozCraig

Antwort

1

Sie ändern den root Wert innerhalb der Funktion. Aus Sicht der aufrufenden Funktion wird jedoch nichts geändert.

Dies könnte funktionieren:

void insert(node** root, int val){ 
    if (*root == NULL){ 
     *root = (node*)(malloc(sizeof(node))); 
     init(*root); 
     (*root)->data = val; 
     printf("added %i\n", val); 
     return; 
    } 
    if (val > (*root)->data){ 
     insert(&((*root)->right), val); 
    } 
    else { 
     insert(&((*root)->left), val); 
    } 
} 

Das grundlegende Konzept ist - wenn man in einem Zeiger auf eine Methode übergibt, kann das Verfahren die Daten ändern, dass der Zeiger auf zeigt, aber die Zeiger selbst nicht verändern kann.

+0

Während funktional identisch, es Es könnte einfacher/klarer sein, eine Zeigerreferenz anstelle eines Doppelzeigers zu verwenden (dh 'node * & root' anstelle von' node ** '). –

+1

@P.Kouvarakis Nicht in C, zumindest, mein Freund. – nbro