2009-11-23 97 views
0
void Insert(AVLnode * & root, string X) 
{ 
    if (root == NULL) 
    { 
     root = GetNode(X); 
    } 
    else if (root->info > X) 
    { 
     Insert(root->left,X); 
     if (height(root->left) - height(root->right) == 2) 
      if (X < root->left->info) 
       RotateRR(root); 
      else 
       RotateLR(root); 
    } 
    else if (root->info < X) 
    { 
     Insert(root->right,X); 
     if (height(root->right) - height(root->left) == 2) 
      if (X > root->right->info) 
       RotateRR(root); 
      else 
       RotateLR(root); 
    } 
    root->height = max(height(root->left), height(root->right))+1; 
} 
AVLnode* find(AVLnode* root,string X) 
{ 
    if (!root) return 0; 
    if (root->info == X) 
     return root; 
    else if (root->info < X) 
     find(root->left,X); 
    else if (root->info > X) 
     find(root->right,X); 
    return 0; 
} 
int main(int argc,char* argv) 
{ 
    AVLnode* Dic; 
    Insert(Dic,"adf"); 
    return 0; 
} 

第一次在Insert,root是NULL,但是當我調試時,它跳過root == null。這是怎麼回事?NULL指針問題?

回答

2

問題出在main()AVLnode* Dic;聲明中。您正在從main()發送一個未初始化的指針insert()。它包含垃圾值。初始化爲NULL

+0

謝謝,簡單而有用的答案:) – nXqd 2009-11-23 05:29:14

1

第一次它不是NULL。變量不會在C++中自動初始化爲NULL或0;它們包含垃圾(無論它們之前包含的內存地址如何)。

AVLnode* Dic;替換爲AVLnode* Dic = NULL;並重試。

1

「插入中的第一次」中,在您輸入的代碼中,root是一個「隨機」值,因爲您從不初始化Dic - 所以在沒有調試器和其他如果你使用調試器。這只是代碼中的一個明確錯誤,所以請在main的第一行;之前加上= 0。之後,您可能會發現更多的錯誤(很難說,因爲您沒有向我們展示GetNodeRotate件事,即使您向我們展示了find功能,這是永遠不會被稱爲的 - 代碼的特殊選擇,以向我們展示, 確實)。