2016-12-15 50 views
-2

我是c中的初学者,我遇到了一个难以修复的问题。当我尝试在一个数组我得到一个无效转换错误的方法的结果存储在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是一个无效的方法,所以我不知道这应该如何。

,应该是相关的问题,post_order方法

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

完整的计划,使这一问题正在发生的事情有其他部位:

#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 [] =“”;'创建* single *字符的数组,并将该单个字符初始化为字符串终结符。 –

+0

至于你的构建错误,你如何*调用函数? –

+1

C不支持_methods_。只有正常的_functions_。 – Olaf

回答

3

void手段返回类型的函数它不会返回任何内容。所以将结果(即没有)分配给任何变量是没有意义的。

即使它返回一个值,你实际上并不调用该函数:

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"); 
} 
相关问题