我试图在二叉搜索树中插入节点,但在 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;
}
最佳答案
您将插入方法称为:
insertNode(root,data,loc);
并且 root
是按值传递的结果,在 insertNode
方法中对 root 所做的任何更改都不会在 main
中可见.由于 main
中的 root
未初始化,因此它会传递给 display
,您会在其中尝试取消引用导致未定义行为的未初始化指针。
要解决此问题,您要么将 root
的地址传递给 insertNode
函数,要么从该函数返回更改后的根。
关于c - 插入二叉搜索树访问冲突错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13412076/