2016-12-15 52 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"); 
} 
相關問題