c - 插入二叉搜索树访问冲突错误

标签 c pointers runtime-error access-violation binary-search-tree

我试图在二叉搜索树中插入节点,但在 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/

相关文章:

c - 如何将二维数组静态初始化为指向指针的指针?

mysql - 为什么我的 Perl 脚本在尝试使用 DBI 连接到数据库时挂起?

java - Android:添加 SDK_INT 代码时运行时崩溃

c - 开发分布式系统时,GCC 工具链的哪些元素应该相同?

python - 如何运行 C 程序并使用 Twisted Python 获取程序输出

c++ - 什么时候 'identifier' 在 C++ 中是 'name'?

c++ - 从指针删除到指针 vector

c++ - 几次(非常好)迭代后循环崩溃/损坏

java - NullPointerException,我不知道从哪里或为什么

c - 以变​​量名作为条件的for循环流程。