2017-06-10 6 views
1

So habe ich ein Array von Strukturen, die ich in einen binären Suchbaum verwandeln möchte. Hier ist, wie mein Code aussieht.Verwandeln Sie ein Array von Strukturen in einen binären Suchbaum

typedef struct Student{ 
    char name[25]; 
    char surname[25]; 
    char Id[8]; 
    double grade; 
}Student; 

struct TNode 
{ 
    struct TNode* data; 
    struct TNode* left; 
    struct TNode* right; 
}; 

struct TNode* newNode(struct TNode* data); 

/* A function that constructs Balanced Binary Search Tree from a sorted array    
*/ 
struct TNode* sortedArrayToBST(struct Student** students, int start, int end) 
{ 
    /* Base Case */ 
    if (start > end) 
     return NULL; 

    /* Get the middle element and make it root */ 
    int mid = (start + end)/2; 
    struct TNode *root = newNode(students[mid]); 

    /* Recursively construct the left subtree and make it 
     left child of root */ 
    root->left = sortedArrayToBST(students, start, mid-1); 

    /* Recursively construct the right subtree and make it 
     right child of root */ 
    root->right = sortedArrayToBST(students, mid+1, end); 

    return root; 
} 

/* Helper function that allocates a new node with the 
    given data and NULL left and right pointers. */ 
struct TNode* newNode(struct TNode * data) 
{ 
    struct TNode* node = (struct TNode*) 
        malloc(sizeof(struct TNode)); 
    node->data = data; 
    node->left = NULL; 
    node->right = NULL; 

    return node; 
} 

/* A utility function to print preorder traversal of BST */ 
void preOrder(struct TNode* node) 
{ 
    if (node == NULL) 
     return; 
    printf("%s %s %s %.2f ", node->data); 
    preOrder(node->left); 
    preOrder(node->right); 
} 

Und hier ist, wie ich die Funktionen in meinem Haupt aufrufen.

struct TNode *root = sortedArrayToBST(&students, 0, n-1); 

scheinen diese nicht aus irgendeinem Grund zu arbeiten, obwohl das Array von Strukturen innerhalb meiner Hauptfunktion funktioniert ok. Ich sortiere immer mein Array von Strukturen innerhalb meines Hauptprogramms, bevor ich die Funktion sortedArraytoBST aufruft. Bitte hilf mir.

+1

nicht Ihren Compiler geben Sie einige * * Warnung auf 'struct TNODE * root = newNode (Studenten [Mitte]); '? –

+0

Ja, aber ich kann nicht verstehen warum. –

Antwort

0

Ich kann nicht sicher sein, ob diese Antwort komplett ist, weil Ihr Code nicht vollständig ist, so kann ich es nicht testen.

Dennoch gibt es eine "offensichtliche" Fehler: Sie erklären

struct TNode* newNode(struct TNode* data); 

aber Sie nennen es mit

struct TNode *root = newNode(students[mid]); 

wo students[mid] ein struct Student * ist.

Zeiger auf verschiedene Arten sind nicht kompatibel in C. Ich Vermutung, was Sie „generic “ ist einig B-Baum haben wollten. Es gibt eine Lösung in C: Der generische Zeiger ist void *. Sie können es nicht dereferenzieren, aber Sie können es implizit von und zu jedem anderen (Daten) Zeigertyp konvertieren.

das Mindeste, was Sie sollten also ist tun Ihre struct ändern: Prototyp

struct TNode 
{ 
    void *data; 
    struct TNode *left; 
    struct TNode *right; 
}; 

und Ihre Funktion:

struct TNode* newNode(void *data); 

in Ihrer preOrder Funktion, Sie versuchen, eine ganze Struktur zu printf() - > das ist nicht möglich, printf() benötigt genau ein Argument pro Konvertierungsspezifizierer! So ändern Sie es z.B. auf diese (wenn Sie data immer auf einen struct Student wissen):

void preOrder(struct TNode* node) 
{ 
    if (node == NULL) 
     return; 
    struct Student *stud = node->data; 
    printf("%s %s %s %.2f ", stud->name, stud->surname, stud->id, stud->grade); 
    preOrder(node->left); 
    preOrder(node->right); 
} 
+0

Danke! Nun könnte das eine dumme Frage sein, aber ich habe immer noch ein Problem mit printf ("% s% s% s% .2f", node-> data); Ich denke, ich weiß, was falsch ist, aber wie kann ich auf das Array zugreifen, um es zum Beispiel zu drucken? –

+0

@NickGarlis Siehe mein Update über ** diesen ** Fehler. –

+0

Danke, aber jetzt bekomme ich einen Segmentierungsfehler. –

Verwandte Themen