1

我試圖在二叉搜索樹中插入節點,我在searchNode()函數的第if(ptr->data== item)行中發生訪問失敗錯誤。我怎樣才能刪除它。我是新來調試。在二進制搜索樹中插入訪問衝突錯誤

我第一次嘗試插入幾個節點,然後使用顯示功能顯示它們。在插入過程中,程序將搜索要插入的節點的適當位置,然後插入它。如果節點已經存在,程序就會返回。

#include<stdio.h> 
#include<conio.h> 
#include<stdlib.h> 
struct node 
{ 
     int data; 
     struct node* left; 
     struct node* right; 
}; 
void searchNode(struct node* root,int item,struct node* loc,struct node *par) 
{ 
       struct node * ptr,*save; 
       if(root==NULL) 
       { 
          loc=NULL; 
          par=NULL; 
          return; 
       } 
       else 
       { 
        if(item==root->data) 
        { 

            par=NULL;loc=root; return; 
        } 
        else if(item < root->data) 
        { 
         save=root;ptr=root->left; 
        } 
        else if(item > root->data) 
        { 
         save=root;ptr=root->right; 
        }    

        while(ptr!=NULL) 
        { 
          if(ptr->data == item) 
          { 
               loc=ptr; 
               par=save; 
              return; 
          } 
          else if(ptr->data > item) 
          { 
           save=ptr; 
           ptr=ptr->left;   
          } 
          else 
          { 
           save=ptr;ptr=ptr->right; 
          } 
        } 
        loc=NULL; 
        par=save; 
       } 
} 
void insertNode(struct node* root,int item, struct node * loc) 
{ 
    struct node* par,*newNode; 
    searchNode(root,item,loc,par); 
    if(loc!=NULL) 
       return; 
    newNode=(struct node *)malloc(sizeof(struct node)); 
    newNode->left=NULL;newNode->right=NULL; 
    if(par==NULL) 
    { 
        root=newNode; 
    } 
    else if(item< par->data) 
    { 
      par->left=newNode; 
    } 
    else if(item> par->data) 
    { 
      par->right=newNode; 
    } 
} 
void display(struct node* t, int level) 
{ 
    int i; 
    if(t) 
    { 
      display(t->right,level+1); 
      printf("\n"); 
      for(i=0;i<level;i++) 
      printf(" "); 
      printf("%d",t->data); 
      display(t->left,level+1); 
    } 
} 
int main() 
{ 
    int n,data,i; 
    struct node* root,*loc; 
    scanf("%d",&n); 
    for(i=0;i<n;i++) 
    { 
        scanf("%d",&data); 
        insertNode(root,data,loc); 
    } 
    display(root,1); 
    getch(); 
    return 0; 
} 

回答

1

,你在呼喚您的插入方法:

insertNode(root,data,loc); 

root由值作爲結果的,在insertNode方法根所做的任何更改將不main可見。由於main中的root未初始化,因此同樣會傳遞到display,您嘗試解除引用導致未定義行爲的未初始化指針。

要解決此問題,請將root的地址傳遞給insertNode函數,或從函數返回已更改的根。

+0

我通過引用傳遞根參見函數的定義void insertNode(struct node * root,int item,struct node * loc) –

+1

指針根值是按值傳遞的。你需要傳遞指針'struct node ** root'的地址來使它工作。 – codaddict

+0

does not works,。!!你可以請進行更改。 @codaddict –