2017-10-26 3 views
0

I-Compiler Störung erhalte, dass genau auf der Linie „rightTree noch nicht deklariert“, wo ich die rightTree bin erklärt ...Siehe Fehler nicht Erklärung genau auf der Linie der Erklärung

Auch heißt es „Baum bezeichnet keinen Typen“wenn ich auch Baum oben erklärt ...

gleichen Fall mit leftTree ...

Code:

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

struct Tree; 
struct Node; 

long int max(long int a,long int b){ 
    if(a>=b){ 
     return a; 
    }else{ 
     return b; 
    } 
} 

struct Node{ 
    long int value; 
    int left_index; 
    int right_index; 
    Node* left_child; 
    Node* right_child; 
}; 

struct Tree{ 
    Node* root; 
    int start; 
    int end; 
}; 

Tree* createTree(Node* root,int start,int end){ 
    Tree* T=new Tree; 
    T->root=root; 
    T->start=start; 
    T->end=end; 
    return T; 
} 

Node* createNode(long value,int left_index,int right_index){ 
    Node* node=new Node; 
    node->value=value; 
    node->left_index=left_index; 
    node->right_index=right_index; 
    node->left_child=NULL; 
    node->right_child=NULL; 
    return node; 
} 

void printNode(Node* node){ 
    cout<<"The value is: "<<node->value<<endl; 
    cout<<"Left index is: "<<node->left_index<<endl; 
    cout<<"Right index is: "<<node->right_index<<endl; 
    if(node->left_child!=NULL){ 
     cout<<"Left child value is: "<<node->left_child->value<<endl; 
    } 
    if(node->right_child!=NULL){ 
     cout<<"Right child value is: "<<node->right_child->value<<endl; 
    } 
    return; 
} 

Tree* mergeTree(Node** nodes,Tree* Tree,int start,int end){ 
    int i; 
    /*for(i=0;i<=end;i++){ 
     cout<<"--\nNode "<<i<<endl; 
     printNode(nodes[i]); 
    }*/ 
    if(start>end){ 
     cout<<"Found start>end..."<<endl; 
     Tree=nullptr; 
     return Tree; 
    }else if(start==end){ 
     Tree->root=nodes[start]; 
     Tree->start=start; 
     Tree->end=end; 
     return Tree; 
    }else if(end==start+1){ 
     if(nodes[start]->value==max(nodes[start]->value,nodes[end]->value)){ 
      Tree->root=nodes[start]; 
     }else{ 
      Tree->root=nodes[end]; 
     } 
     Tree->start=start; 
     Tree->end=end; 
     return Tree; 
    } 
    //base case 
    int mid=(start+end)/2; 

    Tree* rightTree=new Tree; 
    rightTree=mergeTree(nodes,rightTree,start,mid); 

    Tree* leftTree=new Tree; 
    leftTree=mergeTree(nodes,leftTree,mid+1,end); 

    Node* root=new Node; 
    if(rightTree->root->value==max(rightTree->root->value,leftTree->root->value)){ 
     root=rightTree->root; 
    }else{ 
     root=leftTree->root; 
    } 
    root->left_child=leftTree->root; 
    root->right_child=leftTree->root; 
    //Node* root=new Node; 
    return createTree(root,start,end); 
} 

Tree* segmentTree_form(int a[],int n){ 
    int i=0; 
    Node** nodes=(Node**)malloc(n*sizeof(Node*)); 
    for(i=0;i<n;i++){ 
     nodes[i]=createNode(a[i],i,i); 
    } 
    //Leaf Nodes created. 
    /*for(i=0;i<n;i++){ 
     cout<<"--\nNode "<<i<<endl; 
     printNode(nodes[i]); 
    }*/ 
    Tree* T=new Tree; 
    T=mergeTree(nodes,T,0,n-1); 
    return T; 
} 

int main() { 
    Tree* segmentTree=new Tree; 
    int n; 
    cin>>n; 
    int a[n],i=0; 
    for(i=0;i<n;i++){ 
     cin>>a[i]; 
    } 
    segmentTree=segmentTree_form(a,n); 

    //Node* node=createNode(-1,0,0); 
    //printNode(node); 
    return 0; 
} 

Compiler Nachricht:

prog.cpp: In function 'Tree* mergeTree(Node**, Tree*, int, int)': 
prog.cpp:88:11: error: 'rightTree' was not declared in this scope 
    Tree* rightTree=new Tree; 
     ^
prog.cpp:88:25: error: 'Tree' does not name a type 
    Tree* rightTree=new Tree; 
         ^
prog.cpp:91:11: error: 'leftTree' was not declared in this scope 
    Tree* leftTree=new Tree; 
     ^
prog.cpp:91:24: error: 'Tree' does not name a type 
    Tree* leftTree=new Tree; 
         ^

Vielen Dank im Voraus für die Hilfe ....

Ich habe einen Code für den Bau eines Segmentierungsbaum aus einem Array in O (log n) geschrieben ich diesen Fehler nicht debuggen können. Ich suchte im Netz und es sagte Baum und Knoten oben zu erklären, aber das hat nicht funktioniert.

Auch beim Schreiben des Knotens * node = new Node; zeigt keinen Fehler.

+0

Gibt es noch andere Fehler? – user463035818

Antwort

1

Tree* mergeTree(Node** nodes,Tree* Tree,int start,int end)

Sie müssen zweiten Parameter umbenennen. Der Name des Parameters hat den Namen des Typs verborgen.

0

Das Problem ist, dass mergeTree innerhalb der Methode, der Name Tree auf die zweite Variable bezieht sich Tree* Tree und nicht die Art Tree (Der Variablenname versteckt die Typnamen).

Wechseln Sie zu Tree * tree (Kleinbuchstaben), um es zu beheben.

1

In der Funktionsdeklaration blendet der Name des zweiten Parameters den Namen der Struktur Tree aus.

Tree* mergeTree(Node** nodes,Tree* Tree,int start,int end){ 
          ^^^^^^^^^^ 

So eiher die Parameter umbenennen oder die ausgefeilten Typnamen für die Struktur verwenden Tree wie zum Beispiel

struct Tree* rightTree = new struct Tree; 

Nimm ino Konto, dass mit variabler Länge Arrays sind keine Standardfunktion der C++. Also im Allgemeinen dieser Code

ist ungültig.

Auch gibt es einen Speicherverlust im Haupt

int main() { 
    Tree* segmentTree=new Tree; 
    // ... 
    segmentTree=segmentTree_form(a,n); 

    //.. 
    return 0; 
} 

Zunächst wird die einen Speicher dynamisch zugewiesen und dessen Adresse wird der Zeiger segmentTree zugeordnet und dann wird dieser Zeiger überschrieben. Der zugewiesene Speicher wird also nicht freigegeben.

Und Sie sollten den Operator new anstelle von malloc verwenden. Also dieses Code-Snippet

Tree* segmentTree_form(int a[],int n){ 
    int i=0; 
    Node** nodes=(Node**)malloc(n*sizeof(Node*)); 

macht keinen Sinn.