2016-04-10 3 views
0

Ich arbeite an einem Programm, das die Verwendung einer binären Suchstruktur beinhaltet, und ich versuche, die BST zu initialisieren. Aber ich bin zu verstehen, eine harte Zeit, warum wir zwei Strukturen verwenden, und warum bin ich immer „Anfrage Mitglied links in etwas keine Struktur oder Union“Probleme beim Verstehen, warum wir zwei Strukturen für eine binäre Suchstruktur verwenden und verwenden

#include <stdio.h> 
#include <stdlib.h> 
#define ADD_LENGTH 30 



typedef struct treeType{ 
    int listingId, price, propertySize; 
    int numOfBeds, yearBult; 
    char agent[20]; 
    char address[ADD_LENGTH]; 
    struct treeType *left; 
    struct treeType *right; 

}bNode; 

typedef struct treeFrame{ 
    bNode *node; 

}bTree; 
void init(bTree **tree); 


int main(void) 
{ 
    bTree *tree; 
    init(&tree); 

    return 0; 
} 

void init(bTree **tree){ 
    tree = NULL; 
    tree->left = NULL; 
    tree->node->right = NULL; 


} 
+2

'void init (BTree ** Baum) { \t * -Baum = malloc (sizeof (** Baum)); \t (* Baum) -> Knoten = malloc (sizeof (bNode)); \t (* Baum) -> Knoten-> links = NULL; \t (* Baum) -> Knoten-> rechts = NULL; } ' – BLUEPIXY

+0

In' tree-> left = NULL; 'fehlt' node-> '. –

Antwort

1

Aber ich bin eine harte Zeit, Verstehen, warum wir zwei Strukturen verwenden

Sie haben es mit zwei Abstraktionen zu tun - Baum und Knoten eines Baumes. Es macht durchaus Sinn, für jede Abstraktion zwei struct s zu verwenden.

Ihre struct für den Baum, bTree, hat nur ein Mitglied, der Wurzelknoten. Sie können ihm möglicherweise andere Elemente hinzufügen - die Anzahl der Knoten in der Struktur, die maximale Tiefe der Blattknoten in der Struktur usw. Diese können zwar berechnet werden, aber es könnte nützlich sein, sie als Elementvariablen zu verwenden und zu aktualisieren sie, wenn Sie den Baum ändern, um sie verfügbar zu machen, ohne die Kosten für das Überqueren des Baums zu bezahlen.

Die Hauptsache ist, dass ein Baum und die Knoten eines Baumes zwei verschiedene Abstraktionen sind. Sie sollten mit zwei verschiedenen struct s definiert werden. Jeder kann abhängig von den Anforderungen der Anwendung unabhängig erweitert/aktualisiert werden.

warum ich erhalte „Anfrage Mitglied links in etwas keine Struktur oder Union“

-Code in der Funktion init aus mehreren Gründen falsch.

  1. Sie haben keinen Speicher für den "Baum" zugewiesen.
  2. Sie verwenden die Variable tree korrekt. In der Funktion vom Typ bTree**. Es ist ein Zeiger auf einen Zeiger auf eine bTree.
  3. bTree hat kein Element namens left. Daher ist Ihr Versuch, tree->left = NULL; zu verwenden, nicht korrekt.

Was Sie brauchen, ist so etwas wie:

void init(bTree **tree) 
{ 
    // Allocate memory for the tree. 
    *tree = malloc(sizeof(bTree)); 

    // Make the root node NULL to indicate it is an empty tree. 
    (*tree)->node = NULL; 
} 
+0

Mit Abstraktion, was bedeutet das? Auch sollte ich den * Baum auf NULL setzen, wenn ich überprüfen wollte, ob der Stamm NULL ist, sollte das Setzen der Wurzel in der Init-Funktion enthalten sein? – Jude

+1

Siehe https://en.wikipedia.org/wiki/Abstraction_%28computer_science%29 für die Bedeutung Abstraktion. Siehe die aktualisierte 'init'-Funktion. –

Verwandte Themen