存储数组中void方法的结果(无效转换)

时间:2016-12-15 20:33:55

标签: c

我是c的初学者,我遇到的问题是我很难修复。当我尝试将方法的结果存储在数组中时,我在nodes [i]= print_postorder;

中收到了无效的转换错误
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);
       }
    }

问题发生的完整程序:

#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;
}

1 个答案:

答案 0 :(得分: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");
}
相关问题