2017-02-09 23 views
0

我是一個新手在編程和工作在AVL樹atm的實現。我遇到了很多問題,並且在其中的一個問題上尋求幫助,之後我可能會修復其他問題,因爲它們聽起來都很相似。在C,InOrder(和其他功能)的AVL樹不工作

我打印樹序如下功能:

void AVL_in_order_walk(AVLTree* avlt) 
{ 
if(avlt!=NULL){ 
     AVL_in_order_walk(avlt->root->left); 
     printf("%d",avlt->root->value); 
     AVL_in_order_walk(avlt->root->right); 
     } 
} 

這似乎是相當錯誤的。我得到以下警告:

passing argument 1 of ‘AVL_in_order_walk’ from incompatible pointer type [enabled by default] 
    AVL_in_order_walk(avlt->root->left); 

我得到了幾個像這樣的錯誤/警告/筆記。我認爲我有一個很大的問題,只是理解這一點:當我有一個像上面發佈的in_order_walk這樣的函數時,函數不會得到一個節點,它會得到整個樹。我習慣於通過樹或insertFunctions進行幾次散步,但函數始終有一個節點,因爲它被稱爲「void Function(Node * X)」。現在我有整棵樹(AVLTree * avlt),我似乎無法使用遞歸,因爲這樣,我錯了嗎?

BTW: 的Structs的樹和節點:

struct AVLTree 
{ 
    struct AVLNode* root; 
    int numberOfNodes; 
}; 

struct AVLNode 
{ 
    struct AVLNode* left;  
    struct AVLNode* right; 
    struct AVLNode* parent; 
    int value; 
    int height; 
}; 

如何其稱爲:

void AVL_in_order_walk(AVLTree* avlt); 

我真的很感激任何形式的幫助,因爲我只是不明白..

+2

'無效AVL_in_order_walk(AVLTree * AVLT);'這是一個功能_declaration_,不是一個函數_call_。 – Olaf

+0

當然,這是我的不好。我把它稱爲「AVL_in_order_walk(avlt);」 – ykykyk

+3

在遞歸調用 - AVL_in_order_walk(avlt-> root-> left)中,傳遞的參數是類型(AVLNode *),而函數需要類型參數(AVLTree *)。函數調用同樣的問題 - AVL_in_order_walk(avlt-> root-> right); –

回答

2

void AVL_in_order_walk(AVLTree* avlt)被聲明爲接受AVLTree*,但您嘗試將其傳遞給AVLNode*。你的編譯器告訴它們是指向不同類型的指針。

我建議你添加一個可以遞歸調用的隱藏函數,並完成實際工作。

static void AVL_in_order_walk_implementation(AVLNode* avlt) { 
    /* Implement the walk */ 
} 

extern void AVL_in_order_walk(AVLTree* avlt) { 
    if(avlt) 
    AVL_in_order_walk_implementation(avlt->root); 
} 
+0

聽起來不錯,但我如何正確調用它?無論我做什麼,我都會得到10億次警告/錯誤/ ... 我看不出有什麼理由去改變主體中的某些東西,所以我在這兩個函數中做了一些錯誤,我想,我把它叫做你寫下來的。我必須在「空白」之前改變一些東西嗎?如果我沒有得到錯誤,如果我把它們稱爲「靜態」和「外部」,我也可以得到它們。 – ykykyk

+0

@ykykyk - 我剛剛注意到了一些關於你的代碼,讓我懷疑,你是否將代碼構建爲C或C++? – StoryTeller

+0

那就是C,究竟是什麼? – ykykyk