2016-12-15 4 views
-2

私は初心者ですが、私は苦労している問題を抱えています。私は、配列内のメソッドの結果を格納しようとすると、私はnodes [i]= print_postorder;voidメソッドの結果を配列に格納します(無効な変換)

char nodes[]= ""; 
    int i; 
    for(i=0; i< 7; i++){ 
     nodes [i]= print_postorder; 
    } 
    if(sizeof(nodes) > 0){ 
    printf("There are at least one node in the tree"); 
    } 

に無効な変換エラーを取得しています。しかしprint_postorderので、私はこれはどうあるべきか理解しないvoidメソッドです。

問題に関連するべきであり、他の部分、post_order方法

void print_postorder(node * tree) 
    { 
    if (tree) 
     { 
     print_postorder(tree->left); 
     print_postorder(tree->right); 
     printf("%d\n",tree->data); 
     } 
    } 

問題が起こっている完全なプログラム:void手段の戻り値の型を持つ

#include<stdlib.h> 
#include<stdio.h> 

struct bin_tree { 
    int data; 
    struct bin_tree * right, * left; 
}; 
typedef struct bin_tree node; 

void insert(node ** tree, int val) 
{ 
    node *temp = NULL; 
    if(!(*tree)) 
    { 
     temp = (node *)malloc(sizeof(node)); 
     temp->left = temp->right = NULL; 
     temp->data = val; 
     *tree = temp; 
     return; 
    } 

    if(val < (*tree)->data) 
    { 
     insert(&(*tree)->left, val); 
    } 
    else if(val > (*tree)->data) 
    { 
     insert(&(*tree)->right, val); 
    } 

} 

void print_preorder(node * tree) 
{ 
    if (tree) 
    { 
     printf("%d\n",tree->data); 
     print_preorder(tree->left); 
     print_preorder(tree->right); 
    } 

} 

void print_inorder(node * tree) 
{ 
    if (tree) 
    { 
     print_inorder(tree->left); 
     printf("%d\n",tree->data); 
     print_inorder(tree->right); 
    } 
} 

void print_postorder(node * tree) 
{ 
    if (tree) 
    { 
     print_postorder(tree->left); 
     print_postorder(tree->right); 
     printf("%d\n",tree->data); 
    } 
} 

void deltree(node * tree) 
{ 
    if (tree) 
    { 
     deltree(tree->left); 
     deltree(tree->right); 
     free(tree); 
    } 
} 

node* search(node ** tree, int val) 
{ 
    if(!(*tree)) 
    { 
     return NULL; 
    } 

    if(val < (*tree)->data) 
    { 
     search(&((*tree)->left), val); 
    } 
    else if(val > (*tree)->data) 
    { 
     search(&((*tree)->right), val); 
    } 
    else if(val == (*tree)->data) 
    { 
     return *tree; 
    } 
} 

int main() 
{ 
    node *root; 
    node *tmp; 


    root = NULL; 
    /* Inserting nodes into tree */ 
    insert(&root, 9); 
    insert(&root, 4); 
    insert(&root, 15); 
    insert(&root, 6); 
    insert(&root, 12); 
    insert(&root, 17); 
    insert(&root, 2); 

    /* Printing nodes of tree */ 
    printf("Pre Order Display\n"); 
    print_preorder(root); 

    printf("In Order Display\n"); 
    print_inorder(root); 

    printf("Post Order Display\n"); 
    print_postorder(root); 

    char nodes[]= ""; 
    int i; 
    for(i=0; i< 7; i++){ 
     nodes[i]= print_postorder; 
    } 

    if(sizeof(nodes) > 0){ 
     printf("There are at least one node in the tree"); 
    } 

    /* Search node into tree */ 
    tmp = search(&root, 4); 
    if (tmp) 
    { 
     printf("Searched node=%d\n", tmp->data); 
    } 
    else 
    { 
     printf("Data Not found in tree.\n"); 
    } 

    /* Deleting all nodes of tree */ 
    deltree(root); 

    return 0; 
} 
+2

'char nodes [] =" ";'は*単一*文字の配列を作成し、その1文字を文字列ターミネータに初期化します。 –

+0

あなたのビルドエラーに関しては、どのように*関数*を呼び出すのですか? –

+1

Cは_methods_をサポートしていません。通常の_functions_のみです。 – Olaf

答えて

3

機能何も返さないしたがって、結果に何も変数を代入するのは意味がありません。

それが値を返さなかった場合でも、あなたが実際に関数を呼び出していない:

nodes[i]= print_postorder; 

括弧なしで関数名の後に、式は実際には関数のアドレス、ではありません関数を呼び出した結果。

print_postorderには、ツリー内のノードの総数が返されます。これを行うには、intに戻り値の型を変更し、サブツリーが空の場合は、左側の合計と右のサブツリープラス1、または0のいずれかを戻すには:

int print_postorder(node * tree) 
{ 
    if (tree) { 
     int left = print_postorder(tree->left); 
     int right = print_postorder(tree->right); 
     printf("%d\n",tree->data); 
     return left + right + 1; 
    } else { 
     return 0; 
    } 
} 

その後を取り除く、ノード数を確認するにはnodeとループを呼び出し、関数を一度呼び出すだけです。

printf("Post Order Display\n"); 
int node_count = print_postorder(root); 

if(node_count > 0){ 
    printf("There is at least one node in the tree"); 
} 
関連する問題